2016-12-29 32 views
1

我通過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,但左側的圓圈保持灰色,就好像它仍在等待。

FF Developer Tools Screenshot

請求不「失敗」,並呼籲我的功能,但沒有提供(在截圖供的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)拒絕的方式形成請求。

+0

'我想也許這可能是一個CORS問題' - 所以,請求CROSS ORIGIN?如果是這樣,服務器是否響應適當的CORS頭文件? –

+0

所以是打電話給服務器?如果您在沒有表格數據的情況下打電話,它是否有效?幫助你調試這將是相當困難.... – epascarello

+0

@Jaromanda X:請求不是交叉起源。由於在發帖之前我搜索了這個問題,所以我只能在那裏結束。 –

回答

0

我們確定問題在於我們的SSL終端/負載平衡我們的應用程序的CISCO ACE設備。有些東西正在破壞分組數據並阻止請求完成。Here是引用問題和設置進行調整的文章。