Azure Function v3出现Container disposed报错且host.json超时配置不生效问题
问题排查优先级及解决方案
一、优先解决host.json加载失败问题(超时的直接诱因)
你遇到的30分钟超时是Azure Function消费计划的默认超时阈值,说明你配置的2小时超时确实没有生效,而host.json加载失败就是直接原因,常见排查点如下:
- 检查项目中host.json的复制到输出目录属性,必须设置为
如果较新则复制或始终复制,本地运行会读取项目根目录的文件,部署时如果没有复制到输出目录,运行时就无法加载 - 检查部署包的目录结构,host.json必须放在部署包的根目录(对应Azure上
site/wwwroot路径),不能嵌套在子文件夹中,你可以通过函数App的Kudu高级工具查看对应路径下是否存在host.json,和其他正常的同类型函数比对路径 - 检查host.json的编码格式,必须为无BOM的UTF-8编码,其他编码会导致运行时解析失败
- 确认函数运行时版本和配置匹配,你使用的v3版本对应host.json的
version为2.0,你的配置项本身没有问题,但如果部署时误选了v4运行时也可能出现加载异常
二、Container disposed异常排查
该异常本质是运行时尝试访问已经被销毁的DI容器实例,和超时问题直接相关:host.json不生效导致30分钟到点后平台直接销毁容器,仍在运行的进程持有已经被释放的容器引用就会抛出该错误,50%成功率是因为部分任务刚好在30分钟内执行完成。
同时你需要检查代码本身的潜在问题:
- 检查
ProcessListingServiceAsync方法中,是否存在在using var scope的作用域外使用scope内解析出的服务的情况,比如将listingServiceRepository赋值给类全局字段,后续在其他方法中调用,此时scope已经被释放会触发报错 - 检查
IRepository<ListingService>的服务生命周期,如果被注册为Singleton,而其内部依赖了Scope级别的DbContext,当外层Scope释放后,Singleton实例持有的DbContext也会被释放,后续调用就会报错 - 检查代码中是否忽略了传入的
CancellationToken终止信号,平台触发超时后会发送终止信号,如果你没有终止执行,依然继续访问服务实例也会触发该异常
三、验证方案
你可以先手动将正确的host.json上传到Kudu的site/wwwroot目录,重启函数App后验证超时配置是否生效,如果生效后不再抛出容器释放异常,即可确认根因是host.json加载失败导致的超时销毁。
内容的提问来源于stack exchange,提问作者ShaneKm
相关产品推荐
相关产品推荐

