如何使用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
相关产品推荐
相关产品推荐

