9

将产品升级到 .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\"}");
        }
    }
}

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

4

1 回答 1

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 网站都很慢,我正在尝试解决这个问题

于 2013-03-11T16:30:08.737 回答