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

升级到.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应用生命周期:本地调试不存在应用闲置回收、启动后瞬时高并发请求的场景,懒加载的初始化时序不会被打乱,因此可以正常运行。
可行解决方案

按优先级从高到低尝试:

  1. 强制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(); // 新增这一行
  1. 配置IIS应用程序池属性
    在生产服务器的IIS管理器中修改对应应用池的配置:
  • 禁用「闲置超时」,设置为0
  • 开启「始终运行」模式
  • 禁用快速故障保护
    避免应用池回收导致ASB连接被释放后重建时出现时序问题。
  1. 降级NuGet包版本
    如果上述方案无效,可以回退到经过验证的稳定版本组合:
Rebus 6.2.2
Rebus.AzureServiceBus 8.5.3
Rebus.Serilog 6.0.0
Rebus.Serviceprovider 6.3.0

该版本组合不存在IIS托管场景下的初始化时序问题。

内容的提问来源于stack exchange,提问作者user5283666

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:09:03