PostAsJsonAsyncResponse未返回填充结果 Dispatch方法反序列化问题求助
问题定位及修复方案
核心问题点
- Dispatch方法未读取接口返回的反序列化结果,直接实例化空
Response对象返回,自然无法拿到已填充的响应数据 - 异步方法混用
Wait()/.Result同步阻塞和await异步等待,极易触发线程死锁,同时也不符合异步编程规范 DispatchResponse类中Reference属性的类型写错,C#全局唯一标识的标准类型名为Guid(首字母大写),小写guid会导致编译错误或反序列化类型匹配失败PostAsJsonAsyncResponse方法中调用PostAsJsonAsync时使用Wait()同步阻塞,完全多余,增加死锁风险- 返回值类型不匹配:
PostAsJsonAsyncResponse<DispatchItem, DispatchResponse>的返回值类型为Response<DispatchResponse>,而Dispatch方法的返回类型是Response(即Response<string>),二者没有继承关系,无法直接赋值
修正后的代码
1. Dispatch方法修正
如果你可以调整返回类型,推荐直接返回Response<DispatchResponse>:
public async Task<Response<DispatchResponse>> Dispatch(DispatchItem dispatchRequest) { var url = "dispatch/dispatchitem.json"; // 全程使用await异步获取结果,不要用Wait() var response = await PostAsJsonAsyncResponse<DispatchItem, DispatchResponse>(url, dispatchRequest); return response; }
如果必须保留原Response返回类型,需要手动做属性映射:
public async Task<Response> Dispatch(DispatchItem dispatchRequest) { var url = "dispatch/dispatchitem.json"; var response = await PostAsJsonAsyncResponse<DispatchItem, DispatchResponse>(url, dispatchRequest); return new Response { IsSuccessful = response.IsSuccessful, // 按需将DispatchResponse对象转换为字符串赋值给Result,比如序列化 Result = JsonConvert.SerializeObject(response.Result) }; }
2. PostAsJsonAsyncResponse方法修正
去掉不必要的Wait()调用,全程异步等待:
protected async Task<Response<TResponse>> PostAsJsonAsyncResponse<TModel, TResponse>(string url, TModel model) { using (var client = new HttpClient()) { var authCredential = Encoding.UTF8.GetBytes($"{Username}:{Password}"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authCredential)); client.BaseAddress = new Uri(APIUrl); // 直接await异步调用,删除Wait()避免死锁 var response = await client.PostAsJsonAsync(url, model); var responseBody = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) throw new ApiException(response.StatusCode, responseBody); return JsonConvert.DeserializeObject<Response<TResponse>>(responseBody); } }
3. DispatchResponse类修正
修正类型名大小写错误:
public class DispatchResponse { public int Id { get; set; } // 把小写guid改为C#标准类型名Guid public Guid Reference { get; set; } }
内容的提问来源于stack exchange,提问作者user1801525
相关产品推荐
相关产品推荐

