Firefox AJAX POST与FormData永远不会完成

时间:2016-12-29 13:34:17

标签: javascript ajax firefox multipartform-data

我通过AJAX和FormData上传文件作为输入文件控件的更改事件的一部分。 $ form变量是对我的表单的jQuery引用(如果那不明显)。

$.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将POST到服务器:

$.ajax(url, {
    contentType: false,
    data: new FormData(),
    method: "post",
    processData: false
})

具有一些垃圾文本键/值对的FormData也是如此:

var d = new FormData();
d.append("key", "value");
$.ajax(url, {
    contentType: false,
    data: d,
    method: "post",
    processData: false
})

如果尚未选择任何文件(带有空文件的FormData),POST也将成功。

我还确定通过HTTP而不是HTTPS访问应用程序允许Firefox再次开始工作(尽管我仍然不明白为什么)。失败的组合似乎是HTTPS +文件数据。当错误回调被触发时,我也确认xhr.status = 0和xhr.readyState = 0。

使用ProcMon我能够确定我的请求总是离开Firefox并将其发送到我们的负载均衡器(SSL终止),但永远不会离开负载均衡器(没有匹配的Apache日志条目)。这种配置仍适用于IE和Chrome,因此我不确定Firefox是否正在以负载平衡设备(Cisco ACE)拒绝它们的方式形成请求。

1 个答案:

答案 0 :(得分:0)

我们已经确定问题是CISCO ACE设备,我们有SSL终止/负载平衡我们的应用程序。有些东西会破坏数据包数据并阻止请求完成。 Here是引用该问题和要调整的设置的文章。