Rebus对接Azure Service Bus报IBus解析失败及401未授权错误
问题根因
- 你看到的
Could not resolve Rebus.Bus.IBus with decorator depth 0 - registrations: Rebus.Injection.Injectionist+Handler是初始化流程中断后的连带外层报错,不是服务注册、Handler绑定的问题。Rebus执行Start()方法时会同步完成传输层连接、IBus实例构建,一旦Azure Service Bus连接阶段抛出异常,注入容器就会抛出这个解析失败的外层错误。 - 相同代码切MSMQ无报错是因为MSMQ是本地队列,不需要跨网络鉴权、也没有强制TLS版本要求,问题完全出在Azure Service Bus连接环节。
内部异常原文(已翻译)
远程服务器返回错误: (401) 未授权。TLS版本无效。TrackingId:4236d339-2355-4074-b187-9d07904ddb30_G62, SystemTracker:jkc-development.servicebus.windows.net:queuename, Timestamp:2022-06-13T13:34:08
从异常可以定位两个直接触发原因:
- 运行环境使用的TLS版本不满足Azure Service Bus的强制安全要求
- 提供的Azure Service Bus连接凭据无访问权限,或格式错误
修复步骤
1. 全局配置TLS版本
在应用启动入口、Rebus初始化代码之前添加全局配置,强制启用TLS 1.2(Azure Service Bus已全面禁止TLS 1.0/1.1连接):
// 适配Azure Service Bus强制TLS要求 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
注意:如果你的项目基于.NET Framework 4.0及更早版本,需要先将框架升级到4.5.2及以上,才支持TLS 1.2协议配置。
2. 校验连接字符串权限与格式
- 确认从Azure门户获取的连接字符串包含三个核心段,格式正确:
Endpoint=sb://<你的命名空间>.servicebus.windows.net/;SharedAccessKeyName=<策略名>;SharedAccessKey=<密钥> - 确认连接字符串对应的共享访问策略至少开启管理、发送、侦听三项权限:Rebus初始化时会自动检测并创建不存在的输入队列,需要管理权限才能完成该操作。如果不需要自动创建队列,也可以在调用
UseAzureServiceBus时传入参数关闭自动队列创建,此时仅需发送、侦听权限即可。
3. 修复事件逻辑的潜在bug
你当前在BeforeMessageSent事件中直接调用Add方法添加消息头,如果消息进入重试流程再次触发发送事件,会因为key已存在抛出重复键异常,改成索引器赋值即可覆盖/新增头,不会触发报错:
x.BeforeMessageSent += (bus, headers, message, context) => { if (RebusConfigSettings.TimeToBeReceived != "-1") { headers[Headers.TimeToBeReceived] = RebusConfigSettings.TimeToBeReceived; headers[Headers.Express] = "rebus-express"; } };
内容的提问来源于stack exchange,提问作者Kanu Dhakhada
相关产品推荐
相关产品推荐

