.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
相关产品推荐
相关产品推荐

