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

如何实现Mass Transit消费Azure Service Bus发送的消息?

我之前也碰到过一模一样的问题!核心原因是Mass Transit对Azure Service Bus的消息格式有自己的“小要求”——它默认期望消息带上特定的元数据header和符合规范的序列化格式,而直接从ASB发送的原生消息往往缺这些东西。下面是我亲测有效的解决办法:

解决步骤

1. 给原生ASB消息补全Mass Transit需要的元数据

如果是用ASB SDK直接发消息,你得手动添加关键的MessageTypeheader,这个header告诉Mass Transit该把消息交给哪个类型的消费者处理。同时要保证消息体的序列化规则和消费端一致。

举个ASB发送消息的示例代码:

var serviceBusClient = new ServiceBusClient("your-asb-connection-string");
var sender = serviceBusClient.CreateSender("target-queue-name");

// 你的业务消息类
var yourMessage = new OrderCreatedMessage 
{ 
    OrderId = Guid.NewGuid(), 
    CustomerName = "John Doe",
    OrderTotal = 99.99m
};

// 用骆驼峰序列化,和Mass Transit默认规则对齐
var jsonBody = JsonSerializer.Serialize(yourMessage, new JsonSerializerOptions 
{ 
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase 
});

var asbMessage = new ServiceBusMessage(jsonBody)
{
    ContentType = "application/json",
    MessageId = Guid.NewGuid().ToString()
};

// 重点:添加Mass Transit识别消息类型的header
// 值是消息类的完全限定名:命名空间.类名, 程序集名称
asbMessage.ApplicationProperties["MessageType"] = "YourApp.Messages.OrderCreatedMessage, YourApp.Messages";

await sender.SendMessageAsync(asbMessage);

2. 配置Mass Transit消费端兼容原生ASB消息

如果不想每次发消息都手动加header,也可以修改Mass Transit的接收端点配置,让它能直接识别原生的ASB Json消息。关键是启用UseRawJsonSerializer,并配置类型映射:

services.AddMassTransit(x =>
{
    // 注册你的消费者
    x.AddConsumer<OrderCreatedConsumer>();

    x.UsingAzureServiceBus((context, cfg) =>
    {
        cfg.Host("your-asb-connection-string");

        cfg.ReceiveEndpoint("target-queue-name", e =>
        {
            // 启用原生Json消息支持,跳过Mass Transit的专属格式检查
            e.UseRawJsonSerializer();
            
            // 对齐序列化规则,和发送端保持一致
            e.ConfigureJsonSerializerOptions(options =>
            {
                options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
                return options;
            });

            // 把消费者和队列绑定
            e.Consumer<OrderCreatedConsumer>(context);

            // 可选:如果你的消息体里有类型标识字段(比如"messageType"),可以自动映射
            // e.UseMessageTypeIdentifier("messageType");
        });
    });
});

3. 排查常见坑点

  • 日志排查:打开Mass Transit的调试日志,看看有没有“无法识别消息类型”的错误,这大概率是MessageTypeheader没加对或者类型名称不匹配
  • 结构一致性:消费端的消息类必须和发送端的完全一致——属性名、类型、nullable标记都不能差
  • ContentType检查:ASB消息的ContentType必须是application/json,Mass Transit默认会忽略其他类型的消息

如果是用ASB门户或者测试工具发消息,记得手动添加MessageType这个应用属性,不然Mass Transit根本不知道该怎么处理这条消息。

内容的提问来源于stack exchange,提问作者Funky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:15:08