我在 IIS 7 上运行 ASP.NET 应用程序。
服务员开心地哼唱着,直到
- 引发 Application_Start 事件
- 当前连接的用户发出的所有请求都会在 httperrX.log 中出现“Connection_Abandoned_By_ReqQueue”错误
- 引发 Application_End 事件
看起来像是工作进程回收,对吧?但是 w3wp 从未死掉,新的 w3wp 从未启动,也没有记录回收。
这可能是什么原因造成的?我该如何防止这种情况发生?
技术细节:
- Windows Server 2008 R2
- IIS 7
- 具有经典管道的.Net v4.0 应用程序池
- 最多 1 个启用重叠的工作进程
更新
我在对 Web 应用程序进行负载测试时遇到了这种情况。
在整个测试过程中,我多次回收并重新启动了 Web 服务器。显然,这会改变用于获取 Web 资源的加密密钥,如下所述:WebResource.axd 上出现“填充无效,无法删除”异常测试软件还不够智能,无法根据新密钥改变其请求(无需进行重大调整)。
所有这些的结果是,几个请求因 .Net 加密异常而失败。我决定不关心这些请求,并将它们从测试中删除。这似乎解决了这个问题所涉及的奇怪的伪回收问题。
有两件事仍未知:
- 回收是否由错误请求到 WebResource.axd 或者通过任何对 WebResource.axd 的请求?
- 为什么这会导致伪回收,而不是常规回收或根本不回收?该行为仍未记录。
答案1
每当应用程序文件夹中的文件发生更改时,都可能触发应用程序池的回收。防病毒实时监控器因这种行为而臭名昭著,但实际上存在大量潜在违规者。请查看 Tess Ferrandez 的以下内容:
特别是,您可以启用 ASP.Net 健康监控事件,将活动记录到应用程序事件日志中,并记录重启的原因。
答案2
Application_Start 事件只会触发一次,在开始应用程序生命周期。我以前没有听说过 Connection_Abandoned_By_ReqQueue,但听起来像是 Web 应用程序在 Application_Start 的 Global.asax 处理程序中做了一些不寻常的事情。
由于异常导致应用程序退出,因此触发 Application_End 事件;标志着应用程序生命周期的结束。
我假设您了解适用于 IIS6 和 IIS7 的 ASP .Net 应用程序生命周期,如果不知道的话:
IIS 6.0 -http://msdn.microsoft.com/en-us/library/ms178473.aspx
IIS 7.0 -http://msdn.microsoft.com/en-us/library/bb470252.aspx
如果您以前没有看过这些内容,这些文章可能会帮助您消除任何困惑。
为了解决这个问题,我首先要确定有问题的应用程序。如果可以的话,请查看 Global.asax 处理程序,否则,请检查应用程序的更新。
根据我读过的有关您遇到的异常的一个线程,这也可能是内存损坏的情况,但如果是这种情况,我不确定您应该从哪里开始调查。