无法从C#连接Docker中的Azure Service Bus模拟器(404错误)
连接Docker中Azure Service Bus模拟器遇404错误
我正尝试连接运行在Docker容器中的Azure Service Bus模拟器,容器已成功启动且日志显示一切正常,也通过telnet验证了主机可连通该模拟器,但用C#应用连接时持续收到404错误,一直没找到正确的连接字符串配置方式。
模拟器Config.json中的AuthorizationRules配置
"AuthorizationRules": [ { "KeyName": "RootManageSharedAccessKey", "PrimaryKey": "ZDVkM2UyYzUtMTVhMi00NmYwLWJjOWUtYjk5OGRkMmIwZTFh", "Claims": [ "Manage", "Send", "Listen" ] } ]
注:PrimaryKey为本地测试虚构值
C#客户端代码
using Azure.Messaging.ServiceBus.Administration; using System; using System.Threading.Tasks; public class Program { private const string connectionString = "Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=ZDVkM2UyYzUtMTVhMi00NmYwLWJjOWUtYjk5OGRkMmIwZTFh;UseDevelopmentEmulator=true;"; public static async Task Main() { var adminClient = new ServiceBusAdministrationClient(connectionString); try { var queues = adminClient.GetQueuesAsync(); await foreach (var queue in queues) { Console.WriteLine($"Queue: {queue.Name}"); } } catch (Exception ex) { Console.WriteLine($"Failed to list queues: {ex.Message}"); } } }
错误信息
运行程序时持续返回404错误,模拟器运行正常且端口连通,问题大概率出在连接字符串或客户端配置上。
已尝试操作
- 检查模拟器Config.json中的AuthorizationRules配置;
- 确认连接字符串格式,但仍报错;
- 验证模拟器端口正确性,通过telnet确认主机可连通。
解决方案建议
1. 修正连接字符串的端点配置
当使用Docker部署的Azure Service Bus模拟器时,Endpoint需要指定容器映射的HTTP端口而非默认的SB协议端口。模拟器默认的HTTP端口是8080,同时要去掉仅适用于Windows本地模拟器的UseDevelopmentEmulator=true参数,正确的连接字符串应为:
Endpoint=http://localhost:8080;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=ZDVkM2UyYzUtMTVhMi00NmYwLWJjOWUtYjk5OGRkMmIwZTFh;
2. 验证Docker端口映射
确保启动容器时已正确映射端口,比如:
docker run -d -p 5672:5672 -p 8080:8080 mcr.microsoft.com/azure-service-bus-emulator
其中8080是HTTP管理端口,客户端执行队列管理等操作依赖该端口;5672是AMQP协议端口,用于消息收发。
3. 检查模拟器的配置端口
如果修改过模拟器的默认端口,需要在连接字符串中对应调整。可以进入容器查看Config.json文件确认端口配置,确保连接字符串中的端口与模拟器实际监听的端口一致。
4. 用基础客户端测试连通性
先尝试用消息发送/接收客户端测试,排除管理客户端的特殊问题:
using Azure.Messaging.ServiceBus; public static async Task TestSend() { var connectionString = "Endpoint=http://localhost:8080;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=ZDVkM2UyYzUtMTVhMi00NmYwLWJjOWUtYjk5OGRkMmIwZTFh;"; await using var client = new ServiceBusClient(connectionString); var sender = client.CreateSender("test-queue"); await sender.SendMessageAsync(new ServiceBusMessage("Hello")); }
如果这个测试成功,说明连接字符串没问题,问题可能出在管理客户端的权限或模拟器的管理API配置上。
内容的提问来源于stack exchange,提问作者Sam Carleton
相关产品推荐
相关产品推荐

