Azure 服务总线:Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放且无法使用

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

提问人:mattsmith5 提问时间:7/9/2021 更新时间:11/27/2021 访问量:2990

问:

有谁知道这个错误代表什么?我们目前正在使用 Azure 服务总线,并试图理解其含义。

Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用。已释放对象:“Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver”;在堆栈跟踪中找到 IListener:“Microsoft.Azure.WebJobs.ServiceBus.Listeners.ServiceBusListener

azure .net-core azureservicebus

评论

1赞 Adam Vincent 7/9/2021
看来他们还不知道根本原因。我会继续打开一个 GitHub 问题并提供完整的堆栈跟踪,以帮助他们收集找到原因所需的信息。github.com/Azure/azure-functions-host/pull/6758
0赞 Prasad Bhokare 7/10/2021
是否使用 ServiceBus 触发的 Azure Functions?
0赞 mattsmith5 7/10/2021
是,使用 Azure Functions @PrasadBhokare服务总线

答:

2赞 Ricky Gummadi 7/20/2021 #1

看起来您还面临着这个在 GitHub 中仍然悬而未决的已知问题 https://github.com/Azure/azure-functions-host/issues/5240

正如“petterek”所描述的,您可以通过执行以下操作来尝试解决方法

using (var scope = scopeFactory.CreateScope())

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

评论

1赞 Varun Sharma 10/6/2021
哈哈,我有同样的问题,哈哈。至少我们在这里见面:D
1赞 Ricky Gummadi 10/7/2021
哈哈很高兴见到你@VarunSharma希望你保持健康。请记住,如果使用的是处理此消息的 Azure 函数,则重试计数不会有太大帮助,因为重试会立即发生。有一个新的更新 5.xxx nuget 包扩展,用于提供指数重绑定的函数
0赞 Joe Eng 12/17/2022
有人可以确认是否仍然需要此解决方法来避免该问题吗?
0赞 Ricky Gummadi 12/17/2022
@JoeyEng我相信这不再是问题
8赞 Varun Sharma 11/27/2021 #2

好吧,又回来了。作为 .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())

enter image description here

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

但是对于剩下的 10% 的情况,我不得不调试框架代码,因为它没有告诉我它试图解析什么对象并失败。幸运的是,在异常的调用堆栈展开过程中,我能够看到局部变量并看到对象。然后,我不得不更改 StartUp/Program 类中的 DI 代码。我们更新了一些单例对象,并使用 x => x.GetService 等语法进行了解析,但我将其替换为 newed up 对象。V4 中对如何在 JobHost 中解析 DI 范围进行了重大更改。有关详细信息,请参阅此处

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