You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:11:12