【问题标题】:AJAX call being blockedAJAX 调用被阻止
【发布时间】:2011-11-01 07:24:34
【问题描述】:

我已经开发了一个带有报告模块的基于 C# AJAX 的系统,因为更复杂的报告需要大约 30 秒才能运行,所以我已经构建了一个并行 AJAX 调用来报告报告生成的进度。

报告生成器
在报告开始时,我在缓存中创建了一个项目

HttpContext.Current.Cache.Insert(appProgressName, new JSON.ReportProgress(), null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration );

然后在整个报告生成过程中定期更新

((JSON.ReportProgress)HttpContext.Current.Cache[appProgressName]).TimesheetsProcessed++;

最后,当报告完成生成时,它会从缓存中删除

HttpContext.Current.Cache.Remove(appProgressName);

报告进度检查器
然后是在浏览器中每隔几秒运行一次的 AJAX 调用,它会调用服务器上的以下 Web 方法。

[WebMethod]
public static JSON.ReportProgress ReportProgress()
{
    string appProgressName = User.CurrentId() + "_ReportProgress";

    if ( HttpContext.Current.Cache[appProgressName] != null )
    {
        return (eServices.SIBSv2.JSON.ReportProgress)HttpContext.Current.Cache[appProgressName];
    }

    return null;
}

这允许客户端计算报告生成的距离并显示进度条更新。

来自 Firebug 的下图显示它工作正常 - 初始报告生成请求和随后的进度检查。

此代码最初使用开发 Web 浏览器在 Visual Studio 2010 中运行良好,但在五次左右的报告请求后停止运行。部署到生产环境时(使用 Windows 2003、IIS6、.net 4.0)会显示相同的行为,显示前几次尝试的报告生成进度,然后无法处理后续请求。

当此问题开始发生时使用 Firebug 检查 AJAX 调用我可以看到,在主要 AJAX 调用(生成报告)完成之前,用于检查进度的 AJAX 调用不会完成。

对进度检查器 AJAX 方法的异步调用问题发生在我的开发机器和生产环境中。网站运行一段时间后,它似乎停止工作。

对我来说,这表明某些事情没有得到整理,导致它停止工作。在生产环境中回收应用程序池后,它会再次开始工作一段时间。

【问题讨论】:

  • 在 Firefox 中运行前五次,你说?我想知道if that's a coincidence or not... 你的客户端 Ajax 调用是什么样的?您是否在重复相同的 XMLHttpRequest?
  • @matt-gibson 我在 IE、Chrome 和 Firefox 中得到了相同的结果。适用于要生成的前 5 个左右的报告。之后进度不会更新,因为在生成报告之前进度调用不会完成。一次只触发一个进度调用,它会等到完成调用后再进行另一个调用。
  • 我认为stackoverflow.com/questions/4428413/… 可能不相关,但似乎不相关

标签: c# ajax jquery .net-4.0 iis-6


【解决方案1】:

这似乎与Blocked AJAX calls from MVC 上的另一个 StackOverflow 问题有关,该问题已通过更改会话行为得到解决。

我似乎通过以下方式解决了我的问题:

1) 将调用的 AJAX 设置为默认对会话状态具有只读访问权限,在我的 AJAX 页面顶部设置 <%@ Page Language="C#" Async="true" EnableSessionState="ReadOnly" %>

2) 在我的报告生成器 AJAX 查询运行时允许对会话状态进行读/写访问 HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);

到目前为止,这似乎已经解决了这个问题。如果 24 小时后它仍然运行顺利,我会接受这个答案。

但是我仍然对阻塞行为不是立即发生感到困惑,而是在发出一定数量的请求之后才发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多