Python向ASP.NET Core MassTransit创建的RabbitMQ队列发消息异常
问题原因和解决方案
问题根源
两个报错分别对应以下两个配置错误:
_skipped队列生成:Python侧声明的exchange名称、类型不符合MassTransit的默认拓扑规则,发送的消息无法匹配到已注册的消费者,被MassTransit判定为无效消息转发到skipped队列。_error队列生成:发送的消息结构不符合MassTransit默认的信封格式要求,同时messageType的URN值和实际消费的消息类不匹配,导致反序列化失败。
推荐方案(改动最少,兼容性最高)
直接修改C#端MassTransit配置,启用原生JSON序列化支持,无需适配MassTransit专属的信封格式,适合跨语言对接场景。
第一步:修改C# ReceiveEndpoint配置
config.ReceiveEndpoint("mappingQueue", e => { e.ConfigureConsumeTopology = false; // 关闭默认拓扑绑定,避免生成冗余exchange e.UseRawJsonSerializer(); // 启用原生JSON序列化,直接反序列化消息体为目标类 e.ConfigureConsumer<MappingUpdateConsumer>(provider); });
第二步:修改Python发布代码
无需自定义exchange,直接通过RabbitMQ默认交换机发消息到目标队列即可:
import pika import json # 替换为你实际的RabbitMQ连接配置 connection = pika.BlockingConnection(pika.ConnectionParameters( host='localhost', port=5672, credentials=pika.PlainCredentials('你的RabbitMQ用户名', '你的RabbitMQ密码') )) channel = connection.channel() # 声明队列,durable参数要和MassTransit创建的队列属性一致(默认持久化) channel.queue_declare(queue='mappingQueue', durable=True) # 消息结构直接对应C# MappingUpdateMessage类,属性名大小写匹配 message = { "Message": "Hello World" } channel.basic_publish( exchange='', # 用RabbitMQ默认交换机 routing_key='mappingQueue', # 路由键直接填队列名 body=json.dumps(message), properties=pika.BasicProperties( delivery_mode=2, # 消息持久化,和MassTransit默认配置对齐 content_type='application/json' # 必须指定内容类型为JSON ) ) connection.close() print("sent")
可选方案(不改C#代码,适配原生MassTransit格式)
如果你不想修改C#侧配置,可以严格遵循MassTransit的规则调整Python代码:
- 先确认
MappingUpdateMessage类的完整命名空间,比如你的类放在MyProject.Messages命名空间下,那对应的消息exchange名是urn:message:MyProject.Messages:MappingUpdateMessage,这才是MassTransit自动创建的消息exchange,不是你代码里的mappingQueue。 - 消息信封结构、
messageType的URN必须和消息类完全匹配,同时补充必填的消息头字段。
注意事项
- 如果需要Python侧使用小写属性名,可以在C#的
MappingUpdateMessage属性上添加[JsonPropertyName("message")]特性(引用System.Text.Json.Serialization命名空间)做属性名映射。 - 所有RabbitMQ的连接配置、持久化配置要和你现有微服务的配置保持一致。
内容的提问来源于stack exchange,提问作者Justin Hehli
相关产品推荐
相关产品推荐

