ASP.NET Core Web API调用响应值读取错误及修复方案
问题分析与解决方案
你的错误根源是搞反了JSON序列化和反序列化的操作,同时还存在异步代码误用同步阻塞的问题:
- 类型不匹配的直接原因:
JsonConvert.SerializeObject(schoolResponse)会把已经是JSON字符串的schoolResponse再次序列化为字符串(最终得到带转义的JSON字符串),但你试图把这个字符串赋值给SchoolListResponseModel类型的变量,自然会出现类型转换错误。你需要的是反序列化,把JSON字符串转换成目标类型对象。 - 异步代码的问题:使用
.Result会阻塞异步线程,应该用await来正确异步等待结果。
修正后的代码
public async Task<SchoolListResponseModel> GetUserSchools(JObject getSchoolsModel) { SchoolListResponseModel schoolListResponseModel = null; using (var client = new HttpClient()) { var response = await client.PostAsJsonAsync(requestUrl, getSchoolsModel); if (response.IsSuccessStatusCode) { // 异步读取响应字符串,避免阻塞线程 var jsonString = await response.Content.ReadAsStringAsync(); // 反序列化JSON字符串为目标模型对象 schoolListResponseModel = JsonConvert.DeserializeObject<SchoolListResponseModel>(jsonString); } // 可添加非成功状态码的处理逻辑,比如抛出异常或返回默认值 else { throw new HttpRequestException($"请求失败,状态码:{response.StatusCode}"); } } return schoolListResponseModel; }
额外优化建议
- 可以直接使用
HttpClient的ReadFromJsonAsync方法简化代码,无需手动处理字符串反序列化:
if (response.IsSuccessStatusCode) { schoolListResponseModel = await response.Content.ReadFromJsonAsync<SchoolListResponseModel>(); }
- 避免在异步方法中使用
.Result或.Wait(),这会导致线程阻塞甚至死锁,始终用await处理异步操作。
内容的提问来源于stack exchange,提问作者Vasanth R
相关产品推荐
相关产品推荐

