场景:
- 用户正在使用IE9(IE8 / 10不受影响)。
- 用户有一个活跃的会话。
- 页开始的AJAX POST(GET不受影响)请求与一控制器
SessionState(SessionStateBehavior.Required)
属性(ReadOnly
不受影响)。 东西保持被立即处理(如在进展的另一请求,其具有锁定所述会话)该请求。 - 而AJAX POST过程中,用户从页面导航离开(GET或POST - 无所谓)
结果:
- AJAX POST结束并返回一个HTTP 500(该浏览器自退出监听,但你可以看到它在IIS日志)。 IIS失败请求跟踪显示错误是“指定的网络名称不再可用(0x80070040)。”
- 需要读/写会话访问可以执行的下一个请求之前用户的会话被锁定为介于80和120秒(通常约为100)。
由失败请求跟踪IIS创建的日志在进一步深挖表明AJAX POST崩溃这样的会话状态已经被锁定(在后 REQUEST_ACQUIRE_STATE
阶段),但由于REQUEST_RELEASE_STATE
阶段不会发生,会话锁不会被释放。 我假设有一个在发挥一定的安全机制,真实80-120秒后解锁会议,但这很长的悬挂是我的用户显然不希望的。
我有一个简单的VS2012 / .NET 4.5 / MVC4项目展示可在问题https://github.com/jorupp/Ie9SessionCrash (有一个页面,进行了一系列的职位,以行动与睡眠电话)。 显示问题的IIS失败请求跟踪是在项目https://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500 。
要解决这个问题,我们正在规划,以确保我们不会让任何AJAX来电来邮需要会话的行动,并且:
- 使用GET调用在可能的情况
- 使用来电来邮有控制器
SessionState(SessionStateBehavior.ReadOnly)
属性。
有没有更好的办法来解决这个问题,还是我失去了在关系的IIS / .NET补丁呢? 或者是这种情况不适用于其他原因? 我犹豫责怪框架/ IIS这一点,但我想我已经消除了我的代码处于故障。