长时间运行的请求在会话模块中的AcquireReqestState上挂起

时间:2017-01-12 14:41:03

标签: asp.net iis

服务器规格: IIS 7.5,Windows Server 2008 R2(版本6.1),ASP.NET 4.5运行时

我们遇到挂起请求的问题。当我们轮询iis服务器以查找长时间运行的请求时,我们会在下面看到以下结果。

REQUEST "6600000080001fd7" (url:GET /, time:180821 msec, client:10.2.2.7, stage:AcquireRequestState, module:Session)
REQUEST "81000000800034da" (url:POST /url1.aspx, time:8101709 msec, client:10.2.2.7, stage:AcquireRequestState, module:Session)
REQUEST "d600000080001e84" (url:POST /url2.aspx, time:8095609 msec, client:10.2.2.7, stage:AcquireRequestState, module:Session)
REQUEST "c800000080001d31" (url:POST /url3.aspx, time:7494459 msec, client:10.2.2.7, stage:AcquireRequestState, module:Session)
REQUEST "8700000080001e69" (url:GET  /url4.aspx, time:7474179 msec, client:10.2.2.7, stage:AcquireRequestState, module:Session)
REQUEST "ac00000080001ddd" (url:GET  /url5.aspx, time:7472338 msec, client:10.2.2.7, stage:AcquireRequestState, module:Session)

这些挂起的请求每天在我们的应用上发生10-100次。它开始发生在一个主要的应用程序版本,有很多页面更新。我们也将框架从4.0升级到4.5。

如何进一步调试或阻止请求挂起?

用户视角

对于用户,他们提出请求,但它永远不会回来。由于请求是会话堆叠的,因此它们的应用程序会冻结,并且必须先清除其Cookie,然后才能再次访问该应用程序。

其他信息。

我们正在使用单独的状态服务器进行会话管理。使用asp.net runtime 4.5规范Windows Server 2008 R2。

1 个答案:

答案 0 :(得分:1)

在ASP.NET中,会话不是线程安全的。这意味着您不能从同一会话向同一端点发出2个并发请求。因此,如果您有一个长时间运行的请求取决于会话状态,它将导致来自同一会话的所有其他并发请求阻塞,直到请求完成。例如,当向服务器发出几个AJAX请求时,这种行为更加明显,因为它们都来自同一个会话。这就是为什么绝对不会在我的应用程序中使用ASP.NET SessionState的原因之一 - >它只是无法按设计扩展。