Javascript Firefox AJAX POST w/FormData从未完成

Javascript Firefox AJAX POST w/FormData从未完成,javascript,ajax,firefox,multipartform-data,Javascript,Ajax,Firefox,Multipartform Data,我正在通过AJAX和FormData上传一个文件,作为输入文件控件更改事件的一部分。$form变量是对我的表单的jQuery引用(如果不明显的话) 在IE、FF和Chrome中,当我在本地进行测试时,这都能正常工作。一旦应用程序部署到我们的QA环境中,它将仅在FF(50.1.0 64位)中停止工作。我可以在“网络”选项卡中看到帖子,但左边的圆圈保持灰色,好像它仍在等待中 请求确实“失败”并调用了我的函数,但没有提供任何有趣的信息(屏幕截图中也提供了console.log输出) 我认为这可能是C

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

在IE、FF和Chrome中,当我在本地进行测试时,这都能正常工作。一旦应用程序部署到我们的QA环境中,它将仅在FF(50.1.0 64位)中停止工作。我可以在“网络”选项卡中看到帖子,但左边的圆圈保持灰色,好像它仍在等待中

请求确实“失败”并调用了我的函数,但没有提供任何有趣的信息(屏幕截图中也提供了console.log输出)

我认为这可能是CORS的问题,但在about:config中摆弄和安装CORS Everywhere插件并没有改变结果

本地测试和QA测试环境之间的显著区别在于,QA环境是一种负载平衡的SSL卸载配置。我们使用的SSL证书是通配符,这意味着它适用于任何网站*.company.com。本地测试是纯文本的

我确实尝试了一些建议,但没有效果

我最后尝试的是使用Fiddler查看FF和应用程序服务器之间发生了什么。当Fiddler设置为解密HTTPS流量时,该过程开始工作(奇怪)。当Fiddler捕获但不解密HTTPS流量时,它不工作(就像Fiddler没有运行一样)。这让我相信它可能与证书有关

我正在寻找关于这个问题的建议/想法

编辑:

我已经做了进一步的实验,并确定提交一个空FormData将发布到服务器:

$.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带有空文件),过帐也将成功

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


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

我们确定问题在于Cisco ACE设备,我们在应用程序中使用SSL终止/负载平衡。数据包数据被破坏,请求无法完成。是引用问题和要调整的设置的文章。

我想可能是CORS问题
-那么,请求是否跨来源?如果是这样,服务器是否使用适当的CORS头进行响应?向服务器发出的呼叫也是这样吗?如果您在没有表单数据的情况下进行调用,是否有效?帮助您调试这将是相当困难的…@Jaromanda X:请求不是跨来源的。我只是因为在发布之前搜索了一些问题才到达那里。你发布的代码是否完整?表单数据有什么“不寻常”的地方吗?@epascarello:我不认为该调用是向服务器发出的,没有。我可以尝试在没有表单数据的情况下进行调用(我将发送{}),然后看看会发生什么。
var d = new FormData();
d.append("key", "value");
$.ajax(url, {
    contentType: false,
    data: d,
    method: "post",
    processData: false
})