Azure Service Bus接收端实现遇MessagingEntityNotFound异常求助
排查Azure Service Bus接收端MessagingEntityNotFound异常原因及解决方法
异常核心原因
- 实体类型混淆:异常信息明确指出找不到的实体是
Topic:messages-topic,但接收端代码使用了ServiceBusReceiver——这个类仅适用于接收**Queue(队列)的消息。Topic(主题)的消息必须通过对应的Subscription(订阅)**来接收,直接访问Topic会触发"实体找不到"错误。 - 连接字符串不一致:发送端与接收端的
SharedAccessKey不相同,可能后续引发权限问题,需统一为有效密钥。
解决方法
根据业务需求选择以下方案:
方案一:改用Queue(点对点通信场景)
- 在Azure门户中创建一个Queue(例如命名为
messages-queue)。 - 同步修改发送端和接收端的
queueName为该Queue的名称。 - 确保两端使用相同的有效连接字符串,接收端代码可保持原有
ServiceBusReceiver逻辑不变。
方案二:使用Topic+Subscription(发布订阅场景)
- 在Azure门户中,为已有的
messages-topic创建至少一个Subscription(例如命名为messages-subscription)。 - 修改接收端代码,针对Topic的订阅进行消息接收,示例代码如下:
方式1:使用ServiceBusReceiver接收
string connectionString = "Endpoint=sb://vm-qa-testsb.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=你的有效密钥"; string topicName = "messages-topic"; string subscriptionName = "messages-subscription"; // 替换为实际订阅名 await using var client = new ServiceBusClient(connectionString); // 创建针对指定订阅的Receiver ServiceBusReceiver receiver = client.CreateReceiver(topicName, subscriptionName); ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync(); string body = receivedMessage.Body.ToString(); Console.WriteLine(body);
方式2:推荐使用ServiceBusProcessor(更稳定的异步处理)
string connectionString = "Endpoint=sb://vm-qa-testsb.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=你的有效密钥"; string topicName = "messages-topic"; string subscriptionName = "messages-subscription"; await using var client = new ServiceBusClient(connectionString); await using var processor = client.CreateProcessor(topicName, subscriptionName); // 处理消息的逻辑 processor.ProcessMessageAsync += async args => { string body = args.Message.Body.ToString(); Console.WriteLine($"收到消息:{body}"); // 标记消息为已完成,从订阅中移除 await args.CompleteMessageAsync(args.Message); }; // 处理异常的逻辑 processor.ProcessErrorAsync += args => { Console.WriteLine($"接收异常:{args.Exception.Message}"); return Task.CompletedTask; }; // 启动接收 await processor.StartProcessingAsync(); Console.WriteLine("等待接收消息,按任意键退出..."); Console.ReadKey();
额外检查项
- 确认Azure门户中对应的实体(Queue/Topic+Subscription)已创建,且名称与代码中完全匹配(名称不区分大小写,但建议保持一致)。
- 确保连接字符串中的
SharedAccessKey有效,且拥有对应的实体访问权限(RootManageSharedAccessKey拥有全部权限,可用于测试)。
内容的提问来源于stack exchange,提问作者Hemanth Reddy
相关产品推荐
相关产品推荐

