提问人:mattsmith5 提问时间:7/9/2021 更新时间:11/27/2021 访问量:2990
Azure 服务总线:Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放且无法使用
Azure Service Bus: Microsoft.Azure.WebJobs.Script.HostDisposedException: The host is disposed and cannot be used
问:
有谁知道这个错误代表什么?我们目前正在使用 Azure 服务总线,并试图理解其含义。
Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用。已释放对象:“Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver”;在堆栈跟踪中找到 IListener:“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,突然开始出现类似的异常。甚至该功能也是在随机时间触发的。
容器已处置,不应使用:容器已处置。您可以将 Dispose stack-trace 包含在消息中 via:container。With(rules => 规则。WithCaptureContainerDisposeStackTrace())
主机已被释放,无法使用。已释放对象:“Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver” 容器已释放,不应使用:容器已释放。 您可以通过以下方式将 Dispose stack-trace 包含在消息中: 容器。With(rules => 规则。WithCaptureContainerDisposeStackTrace())
添加配置设置AzureFunctionsWebHost__hostId解决了 90% 的错误。您可以在此处阅读更多内容。原因是因为我们的函数名称超过 32 个字符。
但是对于剩下的 10% 的情况,我不得不调试框架代码,因为它没有告诉我它试图解析什么对象并失败。幸运的是,在异常的调用堆栈展开过程中,我能够看到局部变量并看到对象。然后,我不得不更改 StartUp/Program 类中的 DI 代码。我们更新了一些单例对象,并使用 x => x.GetService 等语法进行了解析,但我将其替换为 newed up 对象。V4 中对如何在 JobHost 中解析 DI 范围进行了重大更改。有关详细信息,请参阅此处。
希望这对其他人有所帮助。
评论