【问题标题】:ASP.NET Requests and .NET 4.5 - Strange BehaviorASP.NET 请求和 .NET 4.5 - 奇怪的行为
【发布时间】:2013-02-23 02:36:06
【问题描述】:

将产品升级到 .NET 4.5 后,我们的网站出现了一些奇怪的行为。我会尽量具体,但问题很模糊,所以请多多包涵。此外,对于这种情况,请在没有遵循最佳实践的假设下工作。

用户正在访问一个页面,该页面以异步方式对 Web 服务进行大量 jquery ajax 调用。由于此页面上糟糕的设计/编码,加载可能需要很长时间,但它确实提供了用户需要访问的子菜单。页面开始加载后,他们单击其中一个菜单选项以转到另一个页面。到目前为止没有什么特别的。

当我们在仅安装了 .NET 4.0 的机器上使用 perfmon 时,我们可以看到 ASP.NET 请求如您所料那样上下波动:

当我们将它安装在安装了 .NET 4.5 的机器上时,我们会得到:

执行我上面描述的工作流程后,请求被挂断。未排队;他们只是坐在那里。

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

另外,这仅在使用 IE 时才会发生。使用 Firefox 和 Chrome 时,这不是问题。

这是我们迄今为止尝试过的:

  1. 我们已经联系了 M$ 并向他们发送了 DebugDiag 转储。还在等待。
  2. 我已经访问了 IIS,将站点设置为跟踪失败的请求,并设置了失败的请求过滤器来为我提供一切。一旦站点锁定,我会清除日志,然后检查站点锁定后的内容。每次它在 AspNetSessionDataBegin 和 AspNetSessionDataEnd 事件之间挂起。
  3. 我们确实有一个 HttpHandler 可以读取/写入会话,禁用它似乎可以在很大程度上解决问题,但没有解释原因。
  4. jquery 的 onunload 处理程序应该清理并中止所有剩余的 xmlhttp 请求,但似乎没有持续执行。
  5. 安装了这个patch,仍然没有帮助。
  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\"}");
        }
    }
}

对我们下一步应该去哪里有什么建议吗?

【问题讨论】:

  • HttpHandler 长什么样子?
  • 您是否尝试关闭您的回复?尝试 { Context.Response.End(); } 捕捉(ThreadAbortException 错误){ } 捕捉(异常错误){ }
  • @Sameh 我会尝试,但据我所知,我们使用它来将此数据添加到我们的 jquery ajax 调用中。我认为结束响应将结束它。
  • 是否需要在只设置了内容类型的地方调用response.flush?可以移到条件块的末尾还是完全省略?
  • @LukeS 我来自 Microsoft .NET Framework 兼容性团队。如果您有重现该问题的示例项目,请通过 Microsoft dot com 的 netfx45compat 与我联系。我们很乐意看看。谢谢!

标签: jquery asp.net iis xmlhttprequest .net-4.5


【解决方案1】:

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

以前的答案

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

ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress 找到的解决方案似乎对我们来说更可靠。这是我们在 IE8-10 中遇到的行为,但不仅仅是 9。

我将在此处保留旧答案,因为如果第一个答案不相关,它有望将人们引向另一个方向。

以前的回答

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

Replacing ASP.Net's session entirely

I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

【讨论】:

  • 404页面未找到第一个链接
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多