本地运行Azure Function读取ServiceBus Topic消息时DeliveryCount报错
解决Azure Function访问ServiceBus消息DeliveryCount抛出异常的问题
常见原因及修复方法
消息未完成接收流程
Service Bus的消息属性(比如DeliveryCount)只有在消息处于可访问状态时才能读取。如果在函数绑定的参数里直接访问,可能因为消息还处于锁定状态、接收流程未完成导致异常。
解决办法:改用MessageReceiver手动接收并完成消息后再读取属性,示例代码:var receiver = new MessageReceiver("你的ServiceBus连接字符串", "订阅名称", ReceiveMode.PeekLock); var message = await receiver.ReceiveAsync(); if (message != null) { var count = message.DeliveryCount; await receiver.CompleteAsync(message.SystemProperties.LockToken); }函数参数类型不匹配
如果函数参数用的是自定义实体类而非SDK提供的消息类型(比如ServiceBusReceivedMessage或Microsoft.Azure.ServiceBus.Message),会导致属性映射失败,访问DeliveryCount时抛出异常。
解决办法:将参数类型改为对应SDK的消息类型,示例:[FunctionName("TopicListener")] public static async Task Run( [ServiceBusTrigger("你的主题名", "你的订阅名", Connection = "ServiceBusConnection")] ServiceBusReceivedMessage mySbMsg, ILogger log) { var deliveryCount = mySbMsg.DeliveryCount; log.LogInformation($"消息投递次数:{deliveryCount}"); // 消息处理逻辑 }SDK版本兼容性问题
旧版Service Bus SDK在本地调试时存在属性访问的bug,升级到最新稳定版即可解决。
解决办法:在NuGet包管理器中更新Azure.Messaging.ServiceBus到最新版本,或者在项目文件中指定版本:<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.*" />
内容的提问来源于stack exchange,提问作者Killi
相关产品推荐
相关产品推荐

