升级到.NET 5后使用Azure Service Bus的Rebus.Send无法发送消息
问题原因
- 核心是Rebus Azure Service Bus 传输层9.0.5版本默认采用懒加载初始化ASB连接,在IIS托管的生产环境下,应用启动后如果立刻收到请求,底层
MessageSender还未完成初始化就被调用,会触发状态无效异常。 - Rebus.ServiceProvider 6.4.1版本默认的总线注册逻辑没有强制启动初始化,配合.NET 5的DI作用域管理,在IIS集成管道模式下可能出现总线实例或底层ASB连接被提前释放的问题。
- 本地调试与生产环境的差异来自IIS应用生命周期:本地调试不存在应用闲置回收、启动后瞬时高并发请求的场景,懒加载的初始化时序不会被打乱,因此可以正常运行。
可行解决方案
按优先级从高到低尝试:
- 强制Rebus启动时完成初始化
在AddRebus配置后追加调用StartRebus()扩展方法,在服务注册阶段就完成总线和ASB连接的初始化,避免懒加载时序问题:
services.AddRebus((options, serviceProvider) => options .Logging(l => l.Serilog()) .Transport(t => t.UseAzureServiceBusAsOneWayClient(configuration["RebusConfig:AzureServiceBusConnectionString"])) .Routing(r => { r.TypeBased().MapAssemblyOf<Contract1>(configuration["RebusConfig:Routes:Route1"]) .MapAssemblyOf<Contract2>(configuration["RebusConfig:Routes:Route2"]); }) ) .StartRebus(); // 新增这一行
- 配置IIS应用程序池属性
在生产服务器的IIS管理器中修改对应应用池的配置:
- 禁用「闲置超时」,设置为0
- 开启「始终运行」模式
- 禁用快速故障保护
避免应用池回收导致ASB连接被释放后重建时出现时序问题。
- 降级NuGet包版本
如果上述方案无效,可以回退到经过验证的稳定版本组合:
Rebus 6.2.2 Rebus.AzureServiceBus 8.5.3 Rebus.Serilog 6.0.0 Rebus.Serviceprovider 6.3.0
该版本组合不存在IIS托管场景下的初始化时序问题。
内容的提问来源于stack exchange,提问作者user5283666
相关产品推荐
相关产品推荐

