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