部分 JSON 对象在 .net6/webAPI 中因 HttpClient/IActionResult 交换而丢失
Part of JSON object lost over HttpClient/IActionResult exchange in .net6/webAPI
我有一个 BlazorWASM 客户端请求我的 API 在 .Net5/6.
中使用 HttpClient 的响应
填充对象 'DataManifest' 然后通过 IActionResult 通过 OK() 方法提交:
[HttpGet]
[Route("/Data/GetManifest")]
public async Task<IActionResult> GetManifest()
{
try
{
DataManifest manifest = new();
manifest.LastJob = await _db.jobs.MaxAsync(x=>x.id);
manifest.LastJobCost = await _db.jobcosts.MaxAsync(x => x.id);
manifest.LastEvent = await _db.events.MaxAsync(x => x.task_id);
manifest.LastPurchaseInvoice = await _db.purchaseinvoices.MaxAsync(x => x.id);
manifest.LastTimeRecord = await _db.TimeRecords.MaxAsync(x => x.id);
return Ok(new ApiResponse<DataManifest> { IsSuccess = true, Message = "", Value = manifest, msTiming = (int)watch.ElapsedMilliseconds });
在 VS 中检查对象显示它是完整的,包含数据,'manifest' 的属性设置正确。
但是查看 http 响应(状态:200)中包含的内容,Edge 中 DevTools 的值/'manifest' 对象为空(其他字段按预期填充):
{value: {}, message: "", isSuccess: true, msTiming: 17}
我还有其他运行良好的 HttpGet(确实是像 ApiResponse 这样的对象)。我不明白为什么我的 DataManifest 对象会导致问题!
--- 更多信息:
ApiResponse 是:
public class ApiResponse
{
public string Message { get; set; } = default!;
public bool IsSuccess { get; set; }
public int msTiming { get; set; }
}
public class ApiResponse<T> : ApiResponse
{
public T Value { get; set; } = default!;
}
清单:
public class DataManifest
{
public int lastJob;
public int LastEvent;
public int LastJobCost;
public int LastPurchaseInvoice;
public int LastTimeRecord;
}
你能检查一下 Value
字段定义中没有 JsonIgnore
属性吗?
通过评论解决了,这里的问题是 DataManifest
声明只有字段。
默认情况下,System.Text.Json
忽略字段。您可以通过选项或通过字段上的属性手动配置它以包含它们,但也可以将字段转换为属性以使其工作。
基本上,改变这个:
public class DataManifest
{
public int lastJob;
public int LastEvent;
public int LastJobCost;
public int LastPurchaseInvoice;
public int LastTimeRecord;
}
对此:
public class DataManifest
{
public int lastJob { get; set; }
public int LastEvent { get; set; }
public int LastJobCost { get; set; }
public int LastPurchaseInvoice { get; set; }
public int LastTimeRecord { get; set; }
}
我有一个 BlazorWASM 客户端请求我的 API 在 .Net5/6.
中使用 HttpClient 的响应填充对象 'DataManifest' 然后通过 IActionResult 通过 OK() 方法提交:
[HttpGet]
[Route("/Data/GetManifest")]
public async Task<IActionResult> GetManifest()
{
try
{
DataManifest manifest = new();
manifest.LastJob = await _db.jobs.MaxAsync(x=>x.id);
manifest.LastJobCost = await _db.jobcosts.MaxAsync(x => x.id);
manifest.LastEvent = await _db.events.MaxAsync(x => x.task_id);
manifest.LastPurchaseInvoice = await _db.purchaseinvoices.MaxAsync(x => x.id);
manifest.LastTimeRecord = await _db.TimeRecords.MaxAsync(x => x.id);
return Ok(new ApiResponse<DataManifest> { IsSuccess = true, Message = "", Value = manifest, msTiming = (int)watch.ElapsedMilliseconds });
在 VS 中检查对象显示它是完整的,包含数据,'manifest' 的属性设置正确。
但是查看 http 响应(状态:200)中包含的内容,Edge 中 DevTools 的值/'manifest' 对象为空(其他字段按预期填充):
{value: {}, message: "", isSuccess: true, msTiming: 17}
我还有其他运行良好的 HttpGet(确实是像 ApiResponse 这样的对象)。我不明白为什么我的 DataManifest 对象会导致问题!
--- 更多信息: ApiResponse 是:
public class ApiResponse
{
public string Message { get; set; } = default!;
public bool IsSuccess { get; set; }
public int msTiming { get; set; }
}
public class ApiResponse<T> : ApiResponse
{
public T Value { get; set; } = default!;
}
清单:
public class DataManifest
{
public int lastJob;
public int LastEvent;
public int LastJobCost;
public int LastPurchaseInvoice;
public int LastTimeRecord;
}
你能检查一下 Value
字段定义中没有 JsonIgnore
属性吗?
通过评论解决了,这里的问题是 DataManifest
声明只有字段。
默认情况下,System.Text.Json
忽略字段。您可以通过选项或通过字段上的属性手动配置它以包含它们,但也可以将字段转换为属性以使其工作。
基本上,改变这个:
public class DataManifest
{
public int lastJob;
public int LastEvent;
public int LastJobCost;
public int LastPurchaseInvoice;
public int LastTimeRecord;
}
对此:
public class DataManifest
{
public int lastJob { get; set; }
public int LastEvent { get; set; }
public int LastJobCost { get; set; }
public int LastPurchaseInvoice { get; set; }
public int LastTimeRecord { get; set; }
}