ASP.NET请求和.NET 4.5 - 奇怪的行为

Sch*_*ich 9 asp.net iis jquery xmlhttprequest .net-4.5

将产品升级到.NET 4.5后,我们在网站上遇到了一些奇怪的行为.我会尝试尽可能具体,但问题很模糊,所以请耐心等待.此外,对于这种情况,假设没有遵循最佳实践.

用户来到一个页面,该页面以异步方式向Web服务进行多次jquery ajax调用.由于此页面上的设计/编码较差,可能需要永久加载,但它确实提供了用户需要访问的子菜单.页面开始加载后,单击其中一个菜单选项转到另一个页面.到目前为止没什么特别的.

当我们在只安装了.NET 4.0的盒子上使用perfmon时,我们可以看到ASP.NET请求上下移动,正如您所期望的那样:

在4.0盒子上的Perfmon

当我们将它安装在安装了.NET 4.5的盒子上时,我们得到: 在此输入图像描述

执行上述工作流程后,请求挂断.没有排队; 他们只是坐在那里

经过进一步的研究,我们注意到两个不同页面之间的点击不仅仅是一个简单的href,而且实际上是在使用Response.Redirect(url);

此外,这仅在使用IE时发生.使用Firefox和Chrome时,这不是问题.

以下是我们迄今为止所尝试的内容:

  1. 我们联系了M $并将它们发送出DebugDiag转储.还在等.
  2. 我已经去了IIS,设置网站来跟踪失败的请求,并设置了一个失败的请求过滤器来给我一切.一旦站点锁定,我清除日志,然后检查站点锁定后的内容.每次它都在AspNetSessionDataBegin和AspNetSessionDataEnd事件之间挂起.
  3. 我们确实有一个读取/写入会话的HttpHandler,并且禁用它确实似乎解决了大部分问题,但没有解释为什么.
  4. jquery的onunload处理程序,它应该清理并中止所有剩余的xmlhttp请求,似乎没有经常执行.
  5. 安装这个补丁,仍然没有帮助.
  6. 我们目前正在将此导航逻辑中的Response.Redirect(url)方法更改为Response.Redirect(url,false); (往上看).

同样根据要求,这里是HttpHandler代码:

public class KeepSessionAliveHttpHandler : IHttpHandler, IRequiresSessionState
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {

        if (context.Session.IsNewSession)
        {
            string redirectUrl = context.Request.Url.AbsoluteUri.Replace(context.Request.Url.AbsolutePath, VirtualPathUtility.ToAbsolute(Constant.Page_Logout));
            context.Response.Clear();
            context.Response.ContentType = "application/json; charset=utf-8";
            context.Response.Flush();
            context.Response.Write("{\"IsSessionAlive\": \"false\", \"RedirectUrl\": \"" + redirectUrl + "\"}");
        }
        else
        {
            context.Session["KeepSessionAlive"] = TimeZoneHelper.GetCurrentUtcDateTime();

            context.Response.Clear();
            context.Response.ContentType = "application/json; charset=utf-8";
            context.Response.Flush();
            context.Response.Write("{\"IsSessionAlive\": \"true\"}");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

关于我们下一步应该去哪看的任何建议?

Sch*_*ich 4

Microsoft 现已发布以下补丁,似乎可以修复该问题,而无需更改 web.config 或 IIS 配置。 http://support.microsoft.com/kb/2828841/en-us http://support.microsoft.com/kb/2828842/en-us

以前的答案

经过 .NET 兼容性团队提供的进一步调查和见解/解决方案后,我正在编辑此答案。

如果 IE9 用户在调用正在进行时离开页面,在 ManagedPipelineHandler中找到的针对 AJAX POST 的解决方案似乎对我们来说更可靠。这是我们在 IE8-10 中遇到的行为,而不仅仅是 9。

我将在这里保留旧的答案,因为如果第一个答案不相关,它希望可以为人们指出另一个方向。

前任 前任答案

根源最终是会话锁定。AspNetSessionDataBegin 和 AspNetSessionDataEnd 事件应该是一个致命的赠品。对于遇到同样问题的任何人,请查看您何时以及如何写入会话。这些链接也有帮助。

完全替换 ASP.Net 的会话

我刚刚发现为什么所有 ASP.Net 网站都很慢,我正在尝试解决这个问题