2011-08-22 188 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小時內它仍然順利運行,我會接受這個答案。

但是我仍然困惑的阻止行爲不是直接發生,但只有一定數量的請求後,才做出。