在IE11中,我使用ajax将FormData元素发布到Windows Authenticated端点(IIS7.5 NTLM)。如果FormData元素只包含文本字段,那么一切都很有效 - 初始请求产生401,并且有效负载在随后的带有凭证/有效负载的请求中传递。
但是,如果FormData对象中有File输入,则 不能正常工作。如果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尝试了同样的事情,但结果是一样的。
答案 0 :(得分:0)
问题似乎是最后附加了文件数据。如果我将另外一个键值对添加到表单数据中,则会解决此问题。
这个链接指向了我正确的方向 https://blog.yorkxin.org/posts/2014/02/06/ajax-with-formdata-is-broken-on-ie10-ie11/
答案 1 :(得分:-1)
这不是一个javascript问题。您应该查看服务器端代码。
对于文件上传,我不得不使用FormData。当我使用XMLHttpRequest时,IE11发生语法错误,而它在Chrome和Firefox上运行良好。 当我将其更改为ajax调用时,它开始正常工作。
但又出现了另一个问题。我发送的字符串值是url编码的,我没有正确获取url参数。