2013-02-08 35 views
0

我有jQuery AJAX調用請求從WEB API服務進行彙總計數。 WEB API處理請求並調用傳遞請求參數的存儲過程(sql server)。存儲過程需要更長的時間(超過10分鐘來處理請求,如果存儲過程需要超過10分鐘,jQuery AJAX調用報告狀態碼爲12002或12152的未知錯誤(這些錯誤與連接問題有關),但Web Server在10分鐘後收到存儲過程的結果,IE8.0,IE9.0,firefox出現問題,但即使等待10分鐘以上,Chrome仍然收到響應。是否有解決方案服務器和客戶端之間的通信是活躍的我已經嘗試將連接請求頭從ajax更改爲「關閉」,「打開」,「保持活動」,沒有任何效果。請幫我解決。長時間運行jQuery Ajax調用

Java腳本代碼。

$.ajax({ 
type: "post", 
url: URLPrefix + 'api/querydispatcher/summary', 
data: s, 
success: function (data) { 
window.clearInterval(int); 
$('#wait').hide(); 
$('#CancelSummary').hide(); 
$('#backgroundmodal').hide(); 
$("#tResultTotals").slideDown('slow'); 
DeserializeJSon(eval(data)); 
    if (!CancelSummaryRequest) { 
      CancelSummaryRequest = true; 
      $('#DownloadDetailedReport').show(); 
    } 
      else { 

       $('#tResultTotals').hide(); 
      } 
     }, 
      $('#wait').hide(); 
      $('#CancelSummary').hide(); 
      $('#backgroundmodal').hide(); 
      error_Dialog(request.responseText); 
     } 

    }); 
} 

Server Side (WEB API) code. 

    [WebInvoke(UriTemplate = "summary", Method = "POST")] 
     public List<QueryResult> GetSummaryReport_Queue(JsonValue SummaryXML) 
     { 
      MyContext db = new MyContext(); 
      DateTime StartTime = DateTime.Now; 

      string sumXML = SummaryXML["XMLJson"].ToString().Replace(@"\", "").Replace(@"""", ""); 
      //These are two codes created by JSon @ the end of the String that need to be trim off. 
      sumXML = sumXML.Replace("u000du000a", ""); 

      List<QueryResult> results = null; 

      XElement xxml = XElement.Parse(sumXML); 
      string ReportID = xxml.Descendants("ReportId").FirstOrDefault().Value; 

      string err = ""; 
      try 
      { 

       results = db.fnReportResult(sumXML).ToList(); 
      } 
      catch (Exception e) 
      { 

       err = e.Message + " : "+(e.InnerException!=null?e.InnerException.Message : ""); 
       throw e; 
      } 
      finally { 
       ///--- Record Audit Info. 
       double RunningTime = DateTime.Now.Subtract(StartTime).TotalMilliseconds; 
       string parameters = "ApplicationType:Query_Dispatcher" + "||User:" + SummaryXML["UserId"].ToString().Replace(@"\", "").Replace(@"""", "") + 
         "||Session:" + SummaryXML["Session"].ToString().Replace(@"\", "").Replace(@"""", "") + 
         "||Running Time:" + RunningTime.ToString() + "||Request Type:Summary Report" + 
         "||Report ID:" + ReportID + 
         "||Error:" + err; 

       Audit SaveAudit = new Audit(); 
       SaveAudit.WriteAudit("Query_Builder", parameters); 
       //####-Recording Audit Info 
      } 

      return results; 
     } 
+2

我不會讓連接等待10分鐘 - 我會向'/ whatever'發出'POST' req,它會立即用'202 Accepted'和正在創建的資源的URL來響應。 '/不管/ hashOfSomething'。然後在10分鐘後訪問該URL - 如果資源已準備就緒,則可以使用它,否則在重試之後N分鐘。 – moonwave99 2013-02-08 15:17:11

+0

我該如何重新訪問客戶端的URL(/ whatever /)以檢查記錄是否已被處理? – user1569110 2013-02-08 15:51:48

+0

有一個「超時」選項的Ajax調用 - 你有沒有試過將其設置爲高於600000毫秒? – marty 2013-02-08 15:58:51

回答

0

瀏覽器內置了內部超時,可能會影響此操作。看到它的更多信息,這個StackOverflow的問題:Browser Timeouts

正如其他人所說,等待10分鐘的Ajax響應是非常糟糕的,和大多數瀏覽器可能會在其默認設置您的時間了 - 即使你設定的AJAX超時時間很荒謬。我懷疑你會永遠得到這個工作。

您可以像其他人說的那樣執行查詢,然後向用戶發送鏈接到結果。但是,另一種解決方案是每隔x分鐘在cron上運行查詢並緩存結果。這樣,用戶就可以按需查看結果,而無需等待新網址或等待較長時間。