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

如何使用System.Text.Json库异步反序列化并解决类型转换报错

错误原因
  • 泛型参数硬编码:DeserializeAsync方法手动指定了固定类型GraphQLRequest,没有使用方法声明的泛型参数T,导致返回值类型和预期不匹配
  • 异步返回值未处理:JsonSerializer.DeserializeAsync是异步方法,返回值为ValueTask<T?>类型,不能直接赋值给非Task类型的返回值
  • 异步调用链断裂:原调用Deserialize的方法InvokeAsync本身已经是异步方法,需要配合await消费异步方法的返回值
修改方案

第一步:修改反序列化方法

将反序列化方法调整为符合.NET异步规范的实现,适配泛型参数:

// 方法名加Async后缀符合.NET命名规范,新增可传递的取消令牌可选参数
public static async ValueTask<T> DeserializeAsync<T>(Stream s, CancellationToken cancellationToken = default)
{
    return await JsonSerializer.DeserializeAsync<T>(s, new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true
    }, cancellationToken);
}

第二步:修改调用处代码

InvokeAsync本身是异步方法,直接添加await关键字消费异步反序列化的结果即可:

public async Task InvokeAsync(HttpContext httpContext, ISchema schema)
{
    ...
    var request = await DeserializeAsync<GraphQLRequest>(httpContext.Request.Body);
    ....
}
注意事项

不要使用.Result或者.GetAwaiter().GetResult()同步等待异步方法结果,ASP.NET Core场景下这类操作很容易引发线程死锁,建议全程保持异步调用链。

内容的提问来源于stack exchange,提问作者AndyP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:12:03