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

Azure Service Bus接收端实现遇MessagingEntityNotFound异常求助

排查Azure Service Bus接收端MessagingEntityNotFound异常原因及解决方法

异常核心原因

  • 实体类型混淆:异常信息明确指出找不到的实体是Topic:messages-topic,但接收端代码使用了ServiceBusReceiver——这个类仅适用于接收**Queue(队列)的消息。Topic(主题)的消息必须通过对应的Subscription(订阅)**来接收,直接访问Topic会触发"实体找不到"错误。
  • 连接字符串不一致:发送端与接收端的SharedAccessKey不相同,可能后续引发权限问题,需统一为有效密钥。

解决方法

根据业务需求选择以下方案:

方案一:改用Queue(点对点通信场景)

  1. 在Azure门户中创建一个Queue(例如命名为messages-queue)。
  2. 同步修改发送端和接收端的queueName为该Queue的名称。
  3. 确保两端使用相同的有效连接字符串,接收端代码可保持原有ServiceBusReceiver逻辑不变。

方案二:使用Topic+Subscription(发布订阅场景)

  1. 在Azure门户中,为已有的messages-topic创建至少一个Subscription(例如命名为messages-subscription)。
  2. 修改接收端代码,针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:48:26