.NET 6升级后Event Hub输出JSON含Task属性,如何移除恢复旧格式
问题根因
你遇到的输出异常核心原因是:实际被序列化的对象是Task<T>实例,而非你想要的业务数据对象。
.NET 6升级后大概率触发了以下两种场景之一:
- 你的
SerializationHelper.Serialize()方法在升级时被改为异步实现,返回Task<string>类型,但是你调用时没有添加await关键字,导致最终传给Encoding.UTF8.GetBytes()的是Task对象本身,序列化后就会携带result、status、isCompleted这类Task内置属性。 - 你上层调用Send方法的代码没有
awaitSend调用,误将Send返回的Task对象当成业务数据传入了序列化逻辑。
解决方案
方案1:修正序列化调用
如果是Serialize方法改为异步导致的,修改序列化行代码即可:
// 原错误代码 var eventData = new EventData(Encoding.UTF8.GetBytes(SerializationHelper.Serialize(eventDataContract))); // 修改为加await var eventData = new EventData(Encoding.UTF8.GetBytes(await SerializationHelper.Serialize(eventDataContract)));
如果你的Send方法本身没有返回业务对象,确认上层调用逻辑不要把Send返回的Task对象拿去做序列化即可。
方案2:补充序列化规则(兜底方案)
如果你确认入参没有问题,也可以给序列化器添加忽略Task类型属性的配置,以System.Text.Json为例:
var jsonOptions = new JsonSerializerOptions { IgnoreReadOnlyProperties = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // 序列化时传入该配置 SerializationHelper.Serialize(obj, jsonOptions);
额外优化建议
你当前代码中每次调用Send方法都会新建EventHubProducerClient实例,该类设计为可复用的线程安全类,频繁创建销毁会产生不必要的连接开销,建议将其改为单例注入,在应用生命周期内复用同一个实例。
内容的提问来源于stack exchange,提问作者Fallingsappy
相关产品推荐
相关产品推荐

