IE11 FormData AJAX Post with File 在 401 之后挂起

IE11 FormData AJAX Post with File hangs after 401

本文关键字:之后 挂起 File with FormData AJAX Post IE11      更新时间:2023-09-26

在IE11中,我使用ajax将FormData元素发布到Windows身份验证端点(IIS7.5 NTLM)。如果 FormData 元素仅包含文本字段,则一切正常 - 初始请求生成 401,有效负载在携带凭据/有效负载的后续请求中传递。

但是,如果 FormData 对象中有文件输入,则这不起作用。 如果 FormData 对象中存在文件,IE11 将发送请求,获取 401,然后根本不发送后续请求。 (注意 - 它确实适用于FF/Chrome)

法典:

// This works
var fd = new FormData();    
fd.append("CaseId", 1188);
fd.append("PhaseId", 6);
// Adding this element to the FD makes IE11 hang
// but still works in FF & Chrome
fd.append("MyFile", document.getElementById("MyFileInput").files[0]);
$.ajax({
  url  : "myEndpoint.ashx",
  type : "POST",
  data : fd,
  contentType : false, // do not to adjust content-type
  processData : false, // do not to convert raw data to string
  success     : function(data){
    console.log("Hooray!");
  },
  error : function(xhr){
    console.log("Boo");
  }
});

我已经检查了 Fiddler 中带有/没有文件输入的请求标头,并且 401 请求/响应在各个方面都是相同的。

这是工作请求(无文件输入)。此请求之后的后续请求包括凭据,并导致 200

POST http://example.com/myEndpoint.ashx HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: */*
Content-Type: multipart/form-data; boundary=---------------------------7df11b0308d6
Referer: http://example.com/IE11FormDataTest.html
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)
Connection: Keep-Alive
Host: example.com
Pragma: no-cache
Cookie: ASP.NET_SessionId=mqa12rwnmxerfoz3csx0wohk
Authorization: NTLM TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
Content-Length: 0

这是不起作用的请求(文件输入包含在 FormData 对象中)。当此消息返回时,IE11 无法发出经过身份验证的后续请求。事实上,选项卡的标题只是说"等待 mysite.com...":

POST http://example.com/myEndpoint.ashx HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept: */*
Content-Type: multipart/form-data; boundary=---------------------------7df2c7308d6
Referer: http://example.com/IE11FormDataTest.html
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8)
Connection: Keep-Alive
Host: example.com
Pragma: no-cache
Cookie: ASP.NET_SessionId=mqa12rwnmxerfoz3csx0wohk
Authorization: NTLM TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
Content-Length: 0

有没有人看到我可能缺少的任何内容或对我可以运行/创建的测试有任何建议? 我用原始XMLHttpRequest尝试过同样的事情,但结果是一样的。

问题似乎出在最后附加的文件数据上。如果我在表单数据中再附加一个键值对,则解决了此问题。

这个链接为我指明了正确的方向https://blog.yorkxin.org/posts/2014/02/06/ajax-with-formdata-is-broken-on-ie10-ie11/

这不是JavaScript的问题。您应该查看服务器端代码。

对于文件上传,我必须使用FormData。当我使用XMLHttpRequest时,IE11发生了语法错误,而它在Chrome和Firefox上工作正常。当我将其更改为 ajax 调用时,它开始正常工作。

但另一个问题出现了。我发送的字符串值是 url 编码的,我没有正确获取 url 参数。