AJAX调用被阻止

4
我已经开发了一个基于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的图像显示其正常工作,包括初始报表生成请求和后续的进度检查。
这段代码一开始可以在Visual Studio 2010中使用开发Web浏览器正常运行,但是在五次或更多的报告请求之后停止工作。当部署到生产环境中(使用Windows 2003、IIS6、.net 4.0)时,会出现相同的情况,最初几次尝试显示报表生成进度,然后再进行进一步的请求时就不起作用了。
当出现这个问题时,使用Firebug检查AJAX调用,我发现检查进度所做的AJAX调用直到主AJAX调用(生成报表)完成之前都没有完成。
异步调用进度检查器AJAX方法时出现的问题在我的开发机器和生产环境中都存在。看起来它在网站运行一段时间后就停止工作。
对我来说,这表明在进行后续操作时没有清理某些内容,从而导致停止工作。在生产环境上应用程序池被回收后,它将再次开始工作一段时间。

在火狐浏览器中,前5次有效,你是这么说的?我想知道这是巧合还是别的原因。你的客户端Ajax调用是什么样子的?你是否在重复使用同一个XMLHttpRequest? - Matt Gibson
@matt-gibson 我在IE,Chrome和Firefox中得到了相同的结果。前五个报告可正常生成。之后进度不会更新,因为进度调用要等到报告生成完才能完成。同时一次只会触发一个进度调用,它会等待该调用完成后再进行下一个。 - Peter Bridger
我认为也许https://dev59.com/MG855IYBdhLWcg3wSiQ7#4434805与此无关,但似乎并不是。 - Peter Bridger
1个回答

2
这似乎与另一个StackOverflow问题有关:Blocked AJAX calls from MVC,该问题通过更改会话行为得到了解决。
我通过以下方式解决了我的问题: 1) 将AJAX调用默认设置为只读访问会话状态,在我的AJAX页面顶部设置<%@ Page Language="C#" Async="true" EnableSessionState="ReadOnly" %>2) 当我的报表生成器AJAX查询正在运行时允许读/写访问会话状态 HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required); 到目前为止,在生产中,这似乎已解决了问题。如果24小时后仍然运行顺畅,我将接受此答案。 然而,我仍然困惑的是阻塞行为不会立即发生,而是在一定数量的请求之后才会出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接