IIS 7.5上的会话模块上挂起的请求

时间:2013-05-15 16:54:03

标签: asp.net timeout iis-7.5 httprequest session-state

我的网站上的某些请求有时会开始挂起Session模块的RequestAcquireState状态。当螺旋开始所有请求超时时,我们需要在受影响的服务器上重新启动IIS。

我调查了很多,我得到的唯一结论是,当应用程序试图访问存储在Session中的用户数据时,不知何故发生了死锁。

我能想到解决此问题的唯一选择是减少或停止在我的应用程序中使用Sessions。这是计划的一部分,但在我们完成之前需要一段时间。

我们使用IIS 7.5运行6台计算机,在我们的负载平衡中运行proc StateServer和服务器亲缘关系。

有关如何解决此问题的任何提示或完全修复它而无需完全删除会话?

IIS Hanging Processes

4 个答案:

答案 0 :(得分:6)

提供程序和会话模块(IIS会话模块)上都存在锁定机制。您可以开发自定义会话模块,但仍然需要提供程序而不需要锁定,或者您可以开发自定义提供程序而不需要锁定,但仍需要IIS会话模块,并且在该级别实现并不是那么简单。

解决方案是UnlockedStateProvider [又名为解锁]

跟随白兔:P(检查演示项目,它解释了一切。)

答案 1 :(得分:5)

答案是.NET Framework 4.5的修补程序汇总2828841,这里有所有解释:

http://forums.asp.net/t/1888889.aspx/2/10?Question+regarding+a+possible+bug+within+NET+4+5

这里是download link

它适用于IIS 7.5 Windows Server 2008 rs x64,具有大量ajax请求的asp.net Web表单应用程序。

答案 2 :(得分:5)

我今天刚刚发现,如果你有一个长时间运行的请求(或者在我的情况下,是一个无限循环),那么所有后续请求都将被锁定,因为默认情况下ASP.NET锁定会话。

因此,如果您的用户在RequestAcquireState中有请求,请检查ExecuteRequestHandler中是否存在锁定会话的请求,从而阻止其他请求启动。

如何防止会话锁定有a discussion here。 (基本上,将大多数页面创建为Session-Read-Only,并尽可能少地修改会话。)

答案 3 :(得分:0)

这些用户是否可能有另一个长时间运行的请求,而您看到堆积的请求实际上是次要请求?默认情况下,ASP.NET将锁定Session,直到请求完成。如果第二个请求在第一个请求完成之前进入,则必须等待。如果您使用的是MVC,则可以通过向控制器添加属性来更改此行为。

[SessionState的(SessionStateBehavior.ReadOnly)]

这使Session成为只读,删除了允许后续请求处理的锁定行为。