我部署了一个 Azure 云服务 WebRole WebAPI,只有一个实例。 我注意到,如果我等待一些空闲时间(没有 HTTP 请求),那么稍后服务就会死掉,并且对它的每个请求都会导致以下响应:
{
Message: "An error has occurred."
}
Azure 管理仪表板显示实例状态为“正在运行”。远程桌面显示应用程序池和网站都在运行,并且所需的所有服务都在运行。
我在任何地方都找不到任何相关的错误消息...
针对上述情况,我发现的唯一解决方案是重新启动实例虚拟机。
由于我认为上述情况是空闲时间的结果,所以我查看并发现默认情况下应用程序池本身的空闲超时属性设置为 20 分钟,导致应用程序池内的工作进程在达到空闲超时。我通过手动触发应用程序池回收,成功地重现了该问题,而无需等待超时。
我认为我的服务存在某种问题,无法从关闭中正确恢复。作为证明,一个干净的开箱即用服务项目不会产生相同的行为。
什么会导致这样的问题?
谁能指出我调试这个的正确方向?
我在哪里可以找到有用的错误跟踪消息?
编辑:
我正在使用 Autofac 进行 IoC,我突然想到问题可能是 IoC 在回收后以某种方式被清除。我正在 Global.asax.cs
的 Application_Start()
内执行 IoC 注册。
难道是这个问题?
最佳答案
当 AppDomain 被 IIS 回收时,程序集仅按需加载。尝试使用 System.Web.Compilation.BuildManager
上的 GetReferencedAssemblies
方法来获取引用的程序集的列表。
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
这应该会强制将引用的程序集立即加载到 AppDomain
中,使它们可用于模块扫描。
关于asp.net-mvc - Azure 云服务在应用程序池回收后停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123111/