将产品升级到 .NET 4.5 后,我们的网站上出现了一些奇怪的行为。我会尽量具体,但问题很模糊,所以请多多包涵。此外,对于这种情况,请在没有遵循最佳实践的假设下工作。
用户将进入一个页面,该页面以异步方式对 Web 服务进行大量 jquery ajax 调用。由于此页面上糟糕的设计/编码,加载可能需要很长时间,但它确实提供了用户需要访问的子菜单。页面开始加载后,他们单击其中一个菜单选项以转到另一个页面。到目前为止没有什么特别的。
当我们在仅安装了 .NET 4.0 的机器上使用 perfmon 时,我们可以看到 ASP.NET 请求上下波动,正如您所期望的:
当我们将它安装在安装了 .NET 4.5 的盒子上时,我们会得到:
在执行了我上面描述的工作流程后,请求被挂断了。未排队;他们只是坐在那里。
经过进一步研究,我们注意到两个不同页面之间的点击不仅仅是简单的href,实际上是使用了Response.Redirect(url);
此外,这仅在使用 IE 时发生。使用 Firefox 和 Chrome 时,这不是问题。
以下是我们迄今为止所做的尝试:
- 我们已经联系了 M$ 并将他们发送了 DebugDiag 转储。还在等待。
- 我已经访问了 IIS,将站点设置为跟踪失败的请求,并设置了失败的请求过滤器来为我提供一切。一旦站点锁定,我会清除日志,然后检查站点锁定后的内容。每次它在 AspNetSessionDataBegin 和 AspNetSessionDataEnd 事件之间挂起。
- 我们确实有一个读取/写入会话的 HttpHandler,禁用它似乎在很大程度上解决了问题,但没有解释原因。
- jquery 的 onunload 处理程序,它应该清理并中止所有剩余的 xmlhttp 请求,似乎没有持续执行。
- 安装了这个补丁,还是没用。
- 我们目前正在将此导航逻辑中的 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\"}");
}
}
}
关于我们下一步应该看哪里的任何建议?