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

.NET 6升级后Azure Function(Service Bus触发器)出现容器已释放异常

Azure Function v3升级到v4(.NET 6)后Service Bus触发器异常问题

异常信息

宿主已释放,无法使用。已释放对象:'Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver'; 堆栈跟踪中发现IListener:'Microsoft.Azure.WebJobs.ServiceBus.Listeners.ServiceBusListener, Microsoft.Azure.WebJobs.ServiceBus, Version=4.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 容器已释放,不应再使用:容器已释放。
可通过以下方式将释放堆栈跟踪包含到消息中:
container.With(rules => rules.WithCaptureContainerDisposeStackTrace())

依赖的NuGet包

<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.7.2" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.6.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.1" />
<PackageReference Include="System.Text.Encodings.Web" Version="6.0.0" />

Startup.cs配置代码

public override void Configure(IFunctionsHostBuilder builder)
{
            base.Configure(builder);
            builder.Services.AddSingleton<IServiceClient>((services) =>
            {
                return new ServiceClient(CreateAuthProviderFromSecret(value));
            })
            .AddScoped<IGraphRepository, GraphRepository>()            
            .AddSingleton<IBlobRepository, BlobRepository>((s) =>
            {
                var configuration = s.GetService<IConfiguration>();
                var a = configuration["a"];                
                return new BlobRepository(a);
            });
}

解决建议

1. 升级NuGet包到兼容版本

当前使用的部分扩展包版本与Function v4(.NET 6)兼容性不足,需升级:

  • Microsoft.Azure.WebJobs.Extensions.DurableTask升级至2.13.0及以上的稳定版
  • Microsoft.Azure.WebJobs.Extensions.ServiceBus升级至7.0.0及以上(该版本专为Function v4优化)
  • Microsoft.NET.Sdk.Functions升级至4.2.0及以上的最新稳定版

2. 修复作用域依赖问题

异常核心原因是单例服务中引用了作用域(Scoped)服务,导致ScopedResolver被提前释放:

  • 检查IServiceClient(单例)是否直接或间接依赖了IGraphRepository(Scoped),如果是:
    • 若业务允许,将IGraphRepository的生命周期改为Singleton;
    • 若必须保持Scoped,在单例服务中通过IServiceScopeFactory创建临时作用域使用Scoped服务,示例代码:
      public class ServiceClient : IServiceClient
      {
          private readonly IServiceScopeFactory _scopeFactory;
      
          public ServiceClient(IServiceScopeFactory scopeFactory)
          {
              _scopeFactory = scopeFactory;
          }
      
          public void Execute()
          {
              using var scope = _scopeFactory.CreateScope();
              var graphRepo = scope.ServiceProvider.GetRequiredService<IGraphRepository>();
              // 执行业务逻辑
          }
      }
      

3. 排除手动释放宿主资源的代码

确认Startup.cs或其他代码中没有手动释放Function宿主相关资源的逻辑,v4版本的宿主生命周期由运行时自动管理,无需手动干预。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:33:30