20

这是我的环境:Win 7 上的 IIS7.5、.NET 4、App Pool Integrated

网络配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>

测试.aspx

<%@ Page Language="C#" %>

<!DOCTYPE html>
<script runat="server">
    protected void OnAction(object sender, EventArgs e)
    {
        int count;
        status.Text = (int.TryParse(status.Text, out count) ? count + 1 : 0).ToString();

        Session["test"] = count;
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>IIS Session Hang Test</title>
    <script>
        var mutiPostback = function () {
            var e = document.getElementById('LinkButton1');
            e.click();
            e.click();
        };
    </script>
</head>
<body>
    <form id="Form1" method="post" runat="server">
        <asp:ScriptManager runat="server" ID="SM">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="LinkButton1"/>
            </Triggers>
            <ContentTemplate>
                <asp:Label runat="server" ID="status" />
            </ContentTemplate>
        </asp:UpdatePanel>
        <input type="button" id="button1" onclick="mutiPostback();" value="MultiPostback"/>
        <div style="display: none">
            <asp:Button ID="LinkButton1" runat="server" OnClick="OnAction" Text="Click" />
        </div>
    </form>
</body>
</html>

是的,多次回发是故意的,我们注意到这种行为会导致许多请求卡在 RequestAcquireState 中,并最终阻止服务器接受任何新请求。但是,这个问题只能在 IE 下观察到,而在 Chrome 或 FF 上是看不到的。

要进行测试,请连续单击多次回发按钮。这将更新状态编号。然后,您将能够观察到在使用 IE 时该数字停止增加,表明请求卡住的问题。

我能够使用以下 IIS 和 IE 版本产生此问题:

测试的 IIS 版本

  1. 安装了 .Net 4.5 的 Windows Server 2008 R2 上的 7.5.7600.16385
  2. 安装了 .Net 4.5 的 Windows 7 Pro 上的 7.5.7600.16385

IE版本测试

  1. Windows 7 Pro 上的 9.0.8112.16421
  2. Windows Server 2008 R2 上的 8.0.7600.16385
  3. Windows Server 2003 SP2 上的 6.0.3790.3959

我观察到的异常情况是,当访问本地 IIS 时,Windows Server 2008 R2 上的 8.0.7600.16385 不会导致此阻塞问题。但是,如果我使用浏览器访问远程 IIS,则可以重现该问题。在 IE 9 上,无论 IIS 是在远程还是本地,我都可以重现该问题。

这是工作进程请求列表中挂起请求的屏幕截图。

卡住的请求 现在我们找到了一些解决这个问题的方法,但在我们的情况下没有一个是可以接受的:

  1. 删除/注释掉会话使用情况。
  2. 将应用程序池更改为经典模式。

注意:我们还发现,即使我们不直接使用示例中的Session,问题仍然存在。IE:如果我们添加一个 Global.asax.cs 并添加一个空的 Session_Start 事件处理程序,请求仍然会在 RequestAcquireState 中挂起。

有谁知道为什么会发生这种情况,我们如何解决这个似乎只在集成托管管道模式下发生的问题?

4

4 回答 4

8

根据您的描述,当它尝试获取您的请求的会话对象时,它看起来像 IIS 死锁。我不会在浏览器中寻找原因,因为这只能是服务器端问题。而且可能是您无能为力的。如果它是一个死锁,那么它是一个多线程的、时间相关的问题。因此,如果不同的浏览器以稍微不同的时间发送请求,你会得到不同的结果。此外,如果您在本地或远程运行浏览器,您会得到稍微不同的时间。清空会话无济于事,因为问题在于会话获取。完全禁用会话确实有帮助,因为根本没有获取会话。将 AppPool 更改为 Classic 会有所帮助,因为它具有不同的会话管理实现,没有死锁。为了检验假设,您可以尝试在客户端的回发之间插入人为延迟。这将产生不同的时序条件,并且应该会影响问题。

我不得不说,这些只是基于您的描述和我对 IIS 的经验的推测。我建议您将 AppPool 更改为 Classic,因为性能下降幅度并不大。

于 2013-03-01T07:00:52.377 回答
5

我在我的网站上遇到了类似的问题。在我的例子中,我有一个页面,其中包含许多网格,每个网格都调用 asmx webservice 来检索它们的数据。如果用户在所有 Web 请求完成之前离开该页面,则该用户的会话可能会变得非常慢(加载页面至少需要几分钟),但其他用户的会话不会受到缓慢的影响。对我来说,问题是从我在服务器上安装 .NET 4.5 开始的。

我在这里找到了一个页面:http ://forums.asp.net/t/1888889.aspx/1?Question+regarding+a+possible+bug+within+NET+4+5谈论这是一个已知问题.NET 4.5。如果站点使用集成模式并且浏览器在等待使用 ASP.NET 会话的页面时断开连接,则可以触发该错误。(有关详细信息,请参阅帖子)。

我相信您的双重回发案例可能会导致浏览器放弃其中一个请求,因此这似乎适用。另外,我和其他人注意到,在使用 IE 时似乎更常见该错误(尽管这只是巧合——它不是 IE 错误)

该帖子还描述了一种解决方法(调整 web.config 中的 uploadReadAheadSize 设置),该解决方法为我解决了这个问题。

于 2013-04-11T22:07:19.937 回答
4

好消息!安装 .Net 4.5.1 后会话阻塞问题似乎已解决

我已将安装了 .Net 4.5 的 Windows Server 2008 R2 上的测试机 7.5.7600.16385 升级到 4.5.1,问题就消失了!

于 2014-03-04T20:25:29.753 回答
1

请注意,如果 IE9 用户在调用正在进行时离开页面,则这与 Stackoverflow 帖子 --> AJAX POST 崩溃的 ManagedPipelineHandler相同。

这似乎是 ASP.NET 4.5 中的回归。ASP.NET 团队正在开发补丁,但有一个临时解决方法(请参阅上面提到的帖子)。

如果您不能等待公开的广泛更新,您可以联系 Microsoft 客户支持以获取修补程序请求。只需遵循打开支持案例的常规流程即可。例如,在线提交https://support.microsoft.com/oas/default.aspx?&gprid=548&&st=1&wfxredirect=1&sd=gn或致电支持http://support.microsoft.com/default.aspx?id=fh ;en-us;offerprophone。您可能需要预先支付最低金额,但您可能会根据客户支持政策获得退款。只需让客户支持专业人员联系 Microsoft dot com 的 netfx45compat,即可快速了解此问题。

感谢 Varun Gupta(.NET 框架兼容性)

于 2013-04-14T23:22:42.537 回答