Docker运行Service Bus Emulator时,Function App ServiceBusTrigger连接失败
问题:本地Docker运行Service Bus模拟器,Azure Function的ServiceBusTrigger无法连接
在Docker容器中运行Service Bus模拟器,业务代码可成功向该Service Bus发送消息,但Azure Function的ServiceBusTrigger始终无法正常工作,核心问题为配置的连接名称无法被正确识别,运行后持续抛出连接拒绝错误。
相关配置与代码
local.settings.json 配置
// local.settings.json { "Values": { "ServiceBusConnection__fullyQualifiedNamespace": "sb://localhost:5672" } }
Function 代码(Function1.cs)
// Function1.cs [Function(nameof(ServiceBusTest))] public async Task ServiceBusTest( [ServiceBusTrigger(queueName: Queues.SmokeTest, Connection = "ServiceBusConnection")] RequestBase @event) { await Task.CompletedTask; }
报错信息
Exception: Azure.Messaging.ServiceBus.ServiceBusException: Connection refused ErrorCode: ConnectionRefused (ServiceCommunicationProblem)
解决方案
针对该问题,可从以下几个方向排查修复:
补充身份验证配置
Service Bus模拟器需要SAS密钥验证,仅配置fullyQualifiedNamespace不足以建立连接。修改local.settings.json补充密钥信息:{ "Values": { "ServiceBusConnection__fullyQualifiedNamespace": "sb://localhost:5672", "ServiceBusConnection__sharedAccessKeyName": "RootManageSharedAccessKey", "ServiceBusConnection__sharedAccessKey": "你的模拟器主密钥" } }模拟器密钥可从启动日志、本地配置文件或Docker启动参数中获取。
切换为完整连接字符串
若使用v5以下版本的Service Bus扩展,不支持拆分式配置,需直接配置完整连接字符串:{ "Values": { "ServiceBusConnection": "Endpoint=sb://localhost:5672/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=你的模拟器主密钥" } }验证网络可达性
- 确认Docker容器已正确映射端口:除AMQP协议的5672端口外,若使用NetMessaging协议需额外映射9354端口,确保Function应用能访问这些端口。
- 若Function也运行在Docker容器中,需用Service Bus容器的内部IP或容器名称替代
localhost,避免网络隔离导致无法访问。
适配扩展版本
确认Azure Functions的Service Bus扩展版本为v5及以上,该版本才支持__fullyQualifiedNamespace这类拆分式配置。可通过NuGet包管理器检查并更新Microsoft.Azure.WebJobs.Extensions.ServiceBus包版本。
内容的提问来源于stack exchange,提问作者Branden Barber
相关产品推荐
相关产品推荐

