RequestAcquireState 挂在 .NET 4.5.1 IIS8 上

Posted

技术标签:

【中文标题】RequestAcquireState 挂在 .NET 4.5.1 IIS8 上【英文标题】:RequestAcquireState Hanging on .NET 4.5.1 IIS8 【发布时间】:2017-01-16 06:47:16 【问题描述】:

在负载过重或使用 jQuery 的 ajax 中止功能时,我们看到请求在 IIS 中累积到没有人可以连接并且整个站点挂起,从而强制回收。

similar post from 3 years ago 在 .NET 4.5 和 IIS 7.5 中也存在类似问题,但 Microsoft 已声明此问题已在 4.5.1 中修复,并发布了 4.5 的补丁。

在尝试使用状态服务器时使用 IIS 8 的 Windows Server 2012R2 上出现此问题,在运行 Windows 10 和 IIS10 的开发机器上使用状态服务器时更是如此。由于 4.5.1 的存在阻止了安装程序,因此无法在任何这些机器上安装补丁。更改为 In Proc 可以减少问题的发生,但不能完全解决问题。

今年在 IIS 论坛上的这个 dead thread 有几个其他人有同样的问题,但没有解决方案。我也尝试按照其他地方的建议将 UploadReadAheadSize 设置为 0,但这并没有解决问题。

有其他人经历过和/或找到解决方案吗?任何意见将不胜感激。

【问题讨论】:

我也遇到了同样的问题。当我找到解决方案/修复时,我会在这里发布。你已经想通了吗? @Tweek 我们使用 4.5.2 已经有一段时间了,到目前为止我的团队都没有报告过它。你用的是哪个版本? 我们在 4.5.2 上运行 - 仍然有这个问题。它大部分时间都发生在一些没有任何 jquery/ajax 调用的经典(旧)aspx 页面上。 这与我们看到的相反。如果我们进行 AJAX 调用,在它完成之前取消它,然后尝试进行另一个调用,问题就会显现出来。我想知道更新到 4.6.x 是否会为您解决问题? @DanDef 你遇到过这个问题吗? 【参考方案1】:

我们的问题似乎是由某人在这篇帖子Can I access session state from an HTTPModule? 中实施建议引起的。

这似乎诱使 SessionStateModule 认为它需要加载 SessionState,即使最终将执行的处理程序没有标记为 IRequiresSessionState,方法是将其临时交换为一个。加载 SessionState 后,处理程序将交换回原始处理程序。我怀疑,但没有证明,如果请求被取消,SessionStateModule 不会释放锁,因为当时“正在运行”的处理程序没有用IRequiresSessionState 标记;因此无需清理。

删除模块并标记因此不需要IRequiresSessionState 的处理程序,然后问题就消失了。

【讨论】:

以上是关于RequestAcquireState 挂在 .NET 4.5.1 IIS8 上的主要内容,如果未能解决你的问题,请参考以下文章

Linux 挂在命令mount

你连原理都还没弄明白?差点挂在第四面

挂在 _dl_sysinfo_int80 上的多线程应用程序

面试必考多少Java程序员面试都挂在了它上面!

51 Nod 1307 绳子与重物

51nod 1307 绳子与重物 (标记父节点更新即可)