我通過AJAX和FormData上傳文件,作爲輸入文件控件的更改事件的一部分。 $ form變量是對我的表單的jQuery引用(如果這不明顯)。帶有FormData的Firefox AJAX POST永不完成
$.ajax(url, {
contentType: false,
data: new FormData($form[0]),
method: "post",
processData: false
}).fail(function(xhr, status, error) {
console.log(xhr.responseText);
console.log(status);
console.log(error);
})
當我在本地測試時,這適用於IE,FF和Chrome。一旦將應用程序部署到我們的QA環境中,它將僅在FF(50.1.0 64位)中停止工作。我可以在網絡標籤中看到POST,但左側的圓圈保持灰色,就好像它仍在等待。
請求不「失敗」,並呼籲我的功能,但沒有提供(在截圖供的console.log輸出也)任何有趣的信息。
我想也許它可能是一個CORS問題,但是在about:config和安裝CORS Everywhere插件時沒有產生結果變化。
本地測試和QA測試環境之間的顯着差異在於QA環境是一種負載均衡的SSL卸載配置。我們使用的SSL證書是一個通配符,意味着它適用於任何站點* .company.com。本地測試是純文本。
我確實嘗試了一些建議here,但無濟於事。
我試過的最後一件事是使用Fiddler來查看FF和應用程序服務器之間發生了什麼。當Fiddler設置爲解密HTTPS流量時,流程開始工作(怪異)。當Fiddler捕獲但不解密HTTPS流量時,它不起作用(就像Fiddler沒有運行一樣)。這使我相信它可能與證書有關?
我在尋找關於可能是什麼問題的建議/想法。
編輯:
我已經做了進一步試驗,並決定提交一個空FORMDATA將發佈到服務器:
$.ajax(url, {
contentType: false,
data: new FormData(),
method: "post",
processData: false
})
如將一些垃圾文字鍵/值對FORMDATA :當沒有文件尚未選定(FORMDATA空文件)
var d = new FormData();
d.append("key", "value");
$.ajax(url, {
contentType: false,
data: d,
method: "post",
processData: false
})
發佈也將取得成功。
我也確定通過HTTP訪問應用程序而不是HTTPS允許Firefox重新開始工作(儘管我仍然不明白爲什麼)。失敗的組合似乎是HTTPS +文件數據。我還確認,當錯誤回調被觸發時,xhr.status = 0和xhr.readyState = 0。
使用ProcMon我能夠確定我的請求總是離開Firefox並將其傳送到我們的負載平衡器(SSL終止處),但永遠不會離開負載平衡器(沒有匹配的Apache日誌條目)。對於IE和Chrome,這種配置仍然適用,因此我不確定Firefox是否以負載均衡設備(Cisco ACE)拒絕的方式形成請求。
'我想也許這可能是一個CORS問題' - 所以,請求CROSS ORIGIN?如果是這樣,服務器是否響應適當的CORS頭文件? –
所以是打電話給服務器?如果您在沒有表格數據的情況下打電話,它是否有效?幫助你調試這將是相當困難.... – epascarello
@Jaromanda X:請求不是交叉起源。由於在發帖之前我搜索了這個問題,所以我只能在那裏結束。 –