3

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

{
    Message: "An error has occurred."
}

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

对于上述情况,我发现的唯一解决方案是重新启动实例 VM。

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

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

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

编辑
我正在为 IoC 使用 Autofac,我突然想到问题可能是 IoC 在回收后以某种方式被清除。我正在Application_Start(). 会不会是问题?Global.asax.cs

4

2 回答 2

1

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

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

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

于 2013-06-16T02:40:27.843 回答
1

终于找到问题根源了,确实和IoC容器有关。

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

显然,每当应用程序池回收时,所有已加载的程序集都会被清除,并且不会根据相同的规则重新加载。我实际上发现了一个在 IoC 重新初始化时没有加载的程序集(这是我的解决方案中的弱引用项目)。

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

Assembly.Load([Assembly Name]);

在初始化 IoC 之前。

于 2013-06-15T16:16:32.567 回答