2013-08-30 31 views
0

我有一個用ASP.NET MVC 4編寫的web應用程序。客戶端豐富地使用JQuery在用戶體驗期間執行保存和檢索數據的請求。在某些時候,用戶可以更改一些數據並單擊按鈕式鏈接進行保存。對於架構/性能/需求限制,該方法以兩個步驟製備:JQuery ajax方法在Chrome上POST期間返回錯誤

  1. POST請求被髮送到服務器,以一個給定的URL(其將觸發一個特定的控制器的某些動作),含有JSON目的;
  2. 在第一次POST成功時,計時器被設置爲運行第二次POST到同一服務器,但不同的URL(同一控制器中的另一個操作),根本沒有內容。

第二次POST將開始一個補充過程並結束第一個POST開始。但是,它永遠不會得到服務器。 $ .ajax方法觸發錯誤處理程序。

第一請求代碼的簡化版本是

$.ajax({ 
     url: self.opcoes.urlCreate, 
     type: "POST", 
     data: JSON.stringify(lancamento), 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 
      self.LancarDia(250); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      alert("Não foi possível incluir o lançamento. O servidor retornou\n" + 
          ajaxErrorMessage(jqXHR, textStatus, errorThrown)); 
     } 
}); 

方法LancarDia()接收毫秒量設置爲所述第二請求定時器,這樣的想法是等待250毫秒,然後發送第二個請求。該LancarDia()代碼:

MyClass.prototype.LancarDia = function (milisegundos) { 
    var self = this; 
    if (milisegundos) { 
     if (self.timerLancarDia) 
      clearTimeout(self.timerLancarDia); 
     self.timerLancarDia = setTimeout(function() { 
      self.LancarDia(); 
      self.timerLancarDia = undefined; 
     }, milisegundos); 
     return; 
    } 
    $.ajax({ 
     url: self.opcoes.urlLancarDia + self._dataAtual.format("MM/dd/yyyy"), 
     type: "POST", 
     success: function (data) { 
      if (self.opcoes.onLancou) 
       self.opcoes.onLancou(self._dataAtual); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      var mensagem = "Não foi possível atualizar o MUMPS. Motivo:\n" + 
          ajaxErrorMessage(jqXHR, textStatus, errorThrown); 
      alert(mensagem); 
     } 
    }); 
} 

注意,第一個POST 總是工作和第二失敗很多次並不總是。當它失敗我得到的是:

  • jqXHR.status == 0
  • jqXHR.readystate == 0
  • textStatus == 「錯誤」
  • errorThrown == 「」

在其第一個版本中,代碼沒有使用任何定時器。在第一次POST成功的時候,第二次立即發送。據報道,改變目前的實施方式可以減少問題發生的頻率,但仍然會發生。

只有Chrome顯示這個問題,FireFox和IE運行乾淨。

有沒有人遇到並解決過這個問題?

在此先感謝

回答

0

經過漫長的研究後,我們的基礎架構人員發現問題是由瀏覽器的緩存策略(Chrome)和Web服務器(IIS 7)中配置的緩存策略引起的。

配置IIS添加無緩存緩存控制響應頭後,將問題disapeared。

0

你提到的第二個POST永遠不會被髮送到服務器,你怎麼驗證呢?這聽起來更像是一種競爭狀態,第二個請求在服務器準備好之前發送(例如,它仍在執行由第一個請求啓動的事情)。

+0

這很簡單,我在服務器操作中設置了一個斷點,我發現它從來沒有命中。但是,當問題沒有發生時,斷點就會被觸發。考慮到這一點,我不相信這是一個競爭條件,因爲這個過程基本上是在第一個POST的ddata服務器表中插入一行,然後在第二個POST中刪除它。 – AlexSC

+0

您是否在瀏覽器中使用調試器,例如Firebug或Chrome的開發工具?他們會告訴你,如果在Javascript中發生錯誤,並顯示請求正在發送 – STW