2011-08-22 190 views
3

由于更复杂的报告需要大约30秒的时间才能运行,我开发了一个基于C#AJAX的报告模块的系统我在并行AJAX调用中构建了一个报告生成报告的进度。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); 

报告进度检查
再有就是它每隔几秒钟运行在调用服务器上的以下Web方法浏览器的AJAX调用。

[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下面的图像显示它正常工作 - 与最初的报告生成请求和它后面的进度检查。

AJAX calls working

该代码使用开发的网页浏览器在第一次工作正常通过Visual Studio 2010中,但经过五年左右的报告请求停止工作。当部署到生产(使用Windows 2003,IIS6,.net 4.0)时,会显示相同的行为,显示前几次尝试的报告生成进度,然后无法处理其他请求。

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

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

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

+0

在Firefox的前五次作品中,你说?我怀疑[如果这是巧合或不...](http://stackoverflow.com/questions/561046/how-many-concurrent-ajax-xmlhttprequest-requests-are-allowed-in-popular-browser)什么是你的客户端Ajax调用看起来像?你是否在使用相同的XMLHttpRequest? –

+0

@ matt-gibson我在IE,Chrome和Firefox中获得了相同的结果。适用于生成前5个左右的报告。之后,进度不会更新,因为进度调用直到生成报告之后才会完成。同时只有一个进度调用被触发,它会一直等到它完成调用之后再进行调用。 –

+0

我以为也许http://stackoverflow.com/questions/4428413/why-would-multiple-simultaneous-ajax-calls-to-the-same-asp-net-mvc-action-cause-t/4434805#4434805 wasn没有关系,但似乎不是 –

回答

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小时内它仍然顺利运行,我会接受这个答案。

但是我仍然困惑的阻止行为不是直接发生,但只有一定数量的请求后,才做出。