從我的 API 回傳資料并在客戶端控制器中對其進行反序列化,內容似乎為空。我已經驗證 API 正在回傳有效資料,并且回應中的“計數”是準確的。但是,序列化時的資料似乎沒有被初始化。
不太確定在哪里尋找導致問題的原因。我最好的理論是,由于異步,資料在實作之前就被反序列化了,但這并不能解釋為什么計數是正確的(2 條記錄)。
public async Task<IActionResult> Index()
{
var httpClient = _httpClientFactory.CreateClient("APIClient");
var request = new HttpRequestMessage(HttpMethod.Get, "/api/AppUsers");
var response = await httpClient.SendAsync(request).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
var users = await JsonSerializer.DeserializeAsync<IList<AppUser>>(responseStream);
return View(new IndexViewModel(users));
}
}
else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized ||
response.StatusCode == System.Net.HttpStatusCode.Forbidden)
{
return RedirectToAction("AccessDenied", "Authorization");
}
throw new Exception("Problem accessing the API");
}
呼叫的 API 方法
[HttpGet]
public IActionResult GetAppUsers()
{
var users = _appUserService.ListAppUsers();
return Ok(users);
}

直接呼叫API Method顯示2行如預期回傳

經過一些除錯,我注意到從 API 回傳的 json 結構的屬性名稱中的第一個字母為小寫,但 AppUser 類的第一個字母為大寫。不知道為什么會發生這種情況,但這就是反序列化失敗的原因。
uj5u.com熱心網友回復:
嘗試反序列化為 List 而不是 IList:
var users = await JsonSerializer.DeserializeAsync<List<AppUser>>(responseStream);
我認為您應該洗掉 ConfigureAwait(false) 以便您可以保持相同的同步背景關系。
有關更多資訊,請查看此鏈接:https ://devblogs.microsoft.com/dotnet/configureawait-faq/
uj5u.com熱心網友回復:
在注意到 JSON 物件上的屬性從大寫變為小寫后,解決方案將是強制 JSON 為 PascalCase,因為現在默認為 camelCase
https://codeopinion.com/asp-net-core-mvc-json-output-camelcase-pascalcase/
或者我需要考慮反序列化的camelCase。
這個問題從我的生活中偷走了幾個小時:/希望這篇文章可以為其他人節省一些時間。
一種解決方案是禁用默認設定
builder.Services.AddControllers(options =>
{
options.ReturnHttpNotAcceptable = true;
})
.AddXmlSerializerFormatters()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null; //to avoid defaulting to camelCase
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/474382.html
