如何在Azure Functions 2中访问Azure Service Bus消息属性
在Azure Functions v2+中替代BrokeredMessage的正确姿势
我之前升级Azure Functions SDK的时候也踩过这个坑!在v1版本里,我们确实可以直接把Service Bus触发器的参数声明为BrokeredMessage,就像你写的这样:
public static void Run([ServiceBusTrigger("MyServiceBus", "MySubscriptionName", AccessRights.Listen, Connection = "MyConnectionString")]BrokeredMessage message, TraceWriter log) { // 获取自定义属性 var MyProperty = message.Properties["MyMessageProperty"] as string; // 其他业务逻辑... }
但到了v2.0及以上的SDK,BrokeredMessage已经被弃用了,强制转换的话会直接抛出类型不匹配的错误。这是因为v2+改用了新的Service Bus SDK库,对应的消息类型也做了更新。
不同版本SDK的正确写法
1. v2/v3版本(基于Microsoft.Azure.ServiceBus库)
这个阶段对应的消息类型是Message,同时日志组件从TraceWriter换成了ILogger,获取属性的方式也有变化:
public static void Run([ServiceBusTrigger("MyServiceBus", "MySubscriptionName", Connection = "MyConnectionString")]Message message, ILogger log) { // 获取自定义属性 var MyProperty = message.UserProperties["MyMessageProperty"] as string; // 获取系统属性(比如序列号、过期时间等) var sequenceNumber = message.SystemProperties.SequenceNumber; // 其他业务逻辑... }
2. v4及以上版本(基于Azure.Messaging.ServiceBus库)
这是目前推荐使用的最新库,对应的消息类型是ServiceBusReceivedMessage,属性获取更安全:
public static async Task Run([ServiceBusTrigger("MyServiceBus", "MySubscriptionName", Connection = "MyConnectionString")]ServiceBusReceivedMessage message, ILogger log) { // 安全获取自定义属性,避免键不存在的异常 if (message.ApplicationProperties.TryGetValue("MyMessageProperty", out var propertyValue)) { var MyProperty = propertyValue as string; } // 系统属性直接通过消息对象的属性访问 var sequenceNumber = message.SequenceNumber; // 其他业务逻辑... }
几个关键变化点:
- 日志组件从
TraceWriter替换为ILogger,这是v2+的标准日志方式 - 自定义属性的存储位置从
Properties变成了UserProperties(旧新库)或ApplicationProperties(最新库) - 最新库推荐用
TryGetValue来获取属性,避免因键不存在导致的运行时异常
内容的提问来源于stack exchange,提问作者Andy Rich
相关产品推荐
相关产品推荐

