不时,在我的网站一些要求开始挂在会议模块的RequestAcquireState状态。 当螺旋开始的所有请求暂停,我们需要重新启动受影响的服务器上的IIS。
我调查了很多,我得到的唯一结论是,不知何故,而应用程序试图访问存储在会话用户数据的僵局正在发生的事情。
我能想到的解决这个问题,唯一的选择是要么减少或停止在我的应用程序中使用会话。 这是definetely计划的一部分,但它会需要一段时间才可以完成这一点。
我们在我们的负载平衡运行6台机器与IIS 7.5,出PROC的StateServer和服务器的亲和力。
如何解决这个问题,或者修复它不惜一切,而不必完全删除会话任何提示吗?
锁定机制提供商和会话模块(IIS会话模块)上存在。 您可以开发自定义会话模块,但你仍然需要供应商没有锁定,或者您可以开发自定义提供无锁,但你仍然需要IIS会话模块,它不是那么简单,在这一水平来实现。
该解决方案是UnlockedStateProvider [又名未锁定]
按照白兔:P(检查演示项目,它说明了一切。)
答案是修补程序汇总2828841的.NET框架4.5,这里所有的解释:
http://forums.asp.net/t/1888889.aspx/2/10?Question+regarding+a+possible+bug+within+NET+4+5
这里的下载链接
它为我在IIS 7.5的Windows Server 2008和x64的RS,asp.net web表单与很多Ajax请求的应用。
我今天刚发现,如果你有一个长期运行的请求(或在我的情况,一个无限循环),那么所有后续请求将被锁定,因为通过会话的缺省ASP.NET锁。
所以,如果你有在请求的用户RequestAcquireState
,然后检查是否有在请求ExecuteRequestHandler
被锁定的会话,从而防止其他请求启动。
有在这里讨论如何防止锁定会话。 (基本上,创建大部分网页的的会话只读,并且很少,你可以修改会话)。
是否有可能这些用户有另一个长期运行的要求,你会看到堆积如山的要求实际上是第二次要求? 默认情况下,ASP.NET会直到请求完成锁定会话。 如果第二个请求到达之前,第一个是完整的,它必须等待。 如果您正在使用MVC,您可以通过添加一个属性到控制器更改此行为。
[SessionState的(SessionStateBehavior.ReadOnly)]
这使得会议只读,移除锁定行为使后续请求进行处理。