Azure Service Bus: Microsoft.Azure.WebJobs.Script.HostDisposedException: 主机已处理,无法使用

Azure Service Bus: Microsoft.Azure.WebJobs.Script.HostDisposedException: The host is disposed and cannot be used

有谁知道这个错误代表什么?我们目前正在使用Azure Service Bus,并试图理解它的含义。

Microsoft.Azure.WebJobs.Script.HostDisposedException: The host is disposed and cannot be used. Disposed object: 'Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver'; Found IListener in stack trace: 'Microsoft.Azure.WebJobs.ServiceBus.Listeners.ServiceBusListener

看起来您也面临这个确切的已知问题,该问题在 GitHub 中仍然存在 https://github.com/Azure/azure-functions-host/issues/5240

如“petterek”所述,您可以尝试解决方法

using (var scope = scopeFactory.CreateScope())

或者,在解决此问题之前,您可以增加重试次数,这是我们的临时修复,使消息幂等并增加重试次数。

好的,回来再说一遍。作为 .NET 6 升级的一部分,我将我们的 azure 函数从 v3 升级到 v4,突然开始出现类似的异常。甚至该功能也会随机触发。

容器已处理,不应使用:容器是 disposed.You 可能会在消息中包含 Dispose 堆栈跟踪 via:container.With(rules => rules.WithCaptureContainerDisposeStackTrace())

主机已废弃,无法使用。处置对象:'Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver' 容器已处置,不应使用:容器已处置。 您可以通过以下方式将 Dispose 堆栈跟踪包含到消息中: container.With(规则=> rules.WithCaptureContainerDisposeStackTrace())

添加配置设置 AzureFunctionsWebHost__hostId 解决了 90% 的这些错误。您可以阅读更多 here。原因是因为我们的函数名超过了 32 个字符。

但是对于剩下的 10% 的情况,我不得不调试框架代码,因为它没有告诉我它试图解析和失败的对象。幸运的是在调用堆栈期间 unwinding process of the exception, I was able to see the local variables and saw the object. I had to then change the DI code in StartUp/Program class. There were some singleton objects that we newed up and resolved using syntax like x => x.GetService but I replaced it with newed up object instead. There is a breaking change in V4 on how the DI scopes are resolved within the JobHost. See here 了解更多信息。

希望这对其他人有所帮助。