升级Azure.Messaging.EventHubs至5.9.0后,EventData.Body属性替代方案咨询
Azure.Messaging.EventHubs 5.9.0 中 EventData.Body 的替代方案
升级到5.9.0版本后,EventData.Body的类型从旧版的ArraySegment<byte>改为了ReadOnlyMemory<byte>,因此原代码中的Array、Offset、Count属性无法直接使用,以下是两种可行的替代方案:
方案一:修改Decompress函数适配ReadOnlyMemory
这种方式更高效,无需额外内存复制,直接基于ReadOnlyMemory<byte>处理:
public static string Decompress(ReadOnlyMemory<byte> input) { using var memoryStream = new MemoryStream(); memoryStream.Write(input.Span); memoryStream.Position = 0; using var decompressedStream = new GZipStream(memoryStream, CompressionMode.Decompress); using var streamReader = new StreamReader(decompressedStream, Encoding.UTF8); return streamReader.ReadToEnd(); }
调用时直接传入eventData.Body:
var decompressed = Decompress(eventData.Body);
方案二:保留原Decompress函数,转换参数适配
如果不想修改现有函数签名,可通过MemoryMarshal.TryGetArray获取底层数组片段(避免内存复制);若无法获取则转为字节数组:
if (MemoryMarshal.TryGetArray(eventData.Body, out ArraySegment<byte> segment)) { var decompressed = Decompress(segment.Array, segment.Offset, segment.Count); // 后续业务逻辑 } else { var bodyBytes = eventData.Body.ToArray(); var decompressed = Decompress(bodyBytes, 0, bodyBytes.Length); // 后续业务逻辑 }
相关信息的查找方法
- 通过IDE的「转到定义」功能查看
EventData.Body的类型定义及注释,直接了解属性使用方式 - 查阅SDK版本变更日志,重点关注5.5.0到5.9.0之间的破坏性更新(Breaking Changes)
- 参考官方迁移指南,梳理从旧版
Microsoft.Azure.EventHubs到新版Azure.Messaging.EventHubs的核心API变化
内容的提问来源于stack exchange,提问作者yoyo
相关产品推荐
相关产品推荐

