我有一個用ASP.NET MVC 4編寫的web應用程序。客戶端豐富地使用JQuery在用戶體驗期間執行保存和檢索數據的請求。在某些時候,用戶可以更改一些數據並單擊按鈕式鏈接進行保存。對於架構/性能/需求限制,該方法以兩個步驟製備:JQuery ajax方法在Chrome上POST期間返回錯誤
- POST請求被髮送到服務器,以一個給定的URL(其將觸發一個特定的控制器的某些動作),含有JSON目的;
- 在第一次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運行乾淨。
有沒有人遇到並解決過這個問題?
在此先感謝
這很簡單,我在服務器操作中設置了一個斷點,我發現它從來沒有命中。但是,當問題沒有發生時,斷點就會被觸發。考慮到這一點,我不相信這是一個競爭條件,因爲這個過程基本上是在第一個POST的ddata服務器表中插入一行,然後在第二個POST中刪除它。 – AlexSC
您是否在瀏覽器中使用調試器,例如Firebug或Chrome的開發工具?他們會告訴你,如果在Javascript中發生錯誤,並顯示請求正在發送 – STW