You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:15:05