应用程序池回收后,Azure云服务已停止运行

时间:2013-06-15 11:25:16

标签: asp.net-mvc iis azure asp.net-web-api autofac

我有一个部署的Azure Cloud Service WebRole WebAPI,只有一个实例。 我注意到,如果我等待一些空闲时间(没有HTTP请求),那么稍后该服务已经死亡,并且每个请求都会导致以下响应:

{
    Message: "An error has occurred."
}

Azure管理仪表板显示实例状态为“正在运行”。远程桌面显示应用程序池和网站都在运行,并且所需的所有服务都在运行 我无法在任何地方找到任何相关的错误消息......

我发现上述情况的唯一解决方案是重启到实例虚拟机。

由于我假设上述是空闲时间的结果,我查看并发现默认情况下,应用程序池本身的Idle Timeout属性设置为20分钟,导致在应用程序池中关闭工作进程达到空闲超时。我设法通过手动触发应用程序池回收来重现问题而无需等待超时。

我认为我的服务存在某种问题,无法从关闭状态正确恢复。作为证据,一个干净的开箱即用服务项目不会产生相同的行为。

什么会导致这样的问题?
有人能指出我正确的调试方向吗?
我在哪里可以找到有用的错误跟踪消息?

修改
我正在使用Autofac进行IoC,我突然想到问题可能是IoC在回收后以某种方式被清除。我正在Application_Start()的{​​{1}}内执行IoC注册。
这可能是问题吗?

2 个答案:

答案 0 :(得分:1)

我终于找到了问题源,它确实与IoC容器有关。

为了在本地重现问题,我将Cloud Service部署到本地IIS服务器(而不是IIS Express)。我现在可以停止/启动WebSite,并实际看到异常堆栈跟踪,它立即证明问题实际上是在IoC中未注册的程序集中实现的。

显然,只要应用程序池循环使用,就会清除所有已加载的程序集,而不会根据相同的规则重新加载。我实际上发现了一个程序集(在我的解决方案中是一个弱引用项目),在IoC重新初始化时没有加载。

我不确定为什么它的行为与本地部署不同,但我设法通过调用来解决我的问题:

Assembly.Load([Assembly Name]);

在初始化IoC之前。

答案 1 :(得分:1)

当IIS回收AppDomain时,只会按需加载程序集。尝试使用GetReferencedAssemblies上的System.Web.Compilation.BuildManager方法来获取引用的程序集列表。

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

这应该强制将引用的程序集加载到AppDomain中,立即使它们可用于模块扫描。

相关问题