如何实现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
相关产品推荐
相关产品推荐

