我正在处理带有文件上传部分的单页应用程序。 Knockout用于将视图绑定到视图模型。此应用程序是使用Windows身份验证和IE10作为客户端的Intranet应用程序。如果用户最初上传文件,一切都很好。如果在上传1次后,暂停时间为1分钟或更多,并且尝试进行另一次上传,则应用程序将挂起。这是我的文件上传代码:
var fileToUpload = document.getElementById(fileInputID).files[0];
var formData = new FormData();
formData.append("file", fileToUpload);
formData.append("queueForUpdate", self.queueForUpdate())
xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.addEventListener("progress", uploadProgressOnChange, false);
xhr.addEventListener("load", uploadOnLoad, false);
xhr.send(formData);
这是我在失败开始时得到的东西:
> HTTP/1.1 401 Unauthorized Content-Type: text/html; charset=us-ascii
> Server: Microsoft-HTTPAPI/2.0 WWW-Authenticate: Negotiate
> oYHkMIHhoAMKAQGhDAYKKwYBBAGCNwICCqKBywSByE5UTE1TU1AAAgAAAAYABgA4AAAAFcKJ4kDoPTPX1ToPEGzyAQAAAACKAIoAPgAAAAYBsR0AAAAPSQBTAEkAAgAGAEkAUwBJAAEAFABEAEIATwBSAE8AUwBTAC0AVwA3AAQAEgBpAHMAaQBkAGMALgBjAG8AbQADACgAZABiAG8AcgBvAHMAcwAtAHcANwAuAGkAcwBpAGQAYwAuAGMAbwBtAAUAEgBpAHMAaQBkAGMALgBjAG8AbQAHAAgAgtoTc21EzwEAAAAA
> Date: Thu, 20 Mar 2014 18:51:48 GMT Content-Length: 341 Proxy-Support:
> Session-Based-Authentication
>
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
> 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Not Authorized</TITLE> <META
> HTTP-EQUIV="Content-Type" Content="text/html;
> charset=us-ascii"></HEAD> <BODY><h2>Not Authorized</h2> <hr><p>HTTP
> Error 401. The requested resource requires user authentication.</p>
> </BODY></HTML>
我尝试添加xhr.withCredentials = true;
而不做任何更改。我正在使用本地IIS Web服务器并运行Visual Studio 2012中的代码。
这不是跨站点请求。
答案 0 :(得分:3)
此问题似乎源于Internet Explorer使用NTLM身份验证的方式。 IE在从域接收HTTP 401响应时检测到站点正在使用NTLM身份验证。当发生像我问题中那样的大型POST操作时,IE将发送一个零字节POST请求,期望获得401返回,然后它可以使用用户凭据进行响应。这可以防止必须两次发送数据。
在我的设置中,我会收到401回来,IE似乎用凭据和文件上传响应服务器。无论出于何种原因,服务器都没有响应那个超时的请求。
我在其他StackOverflow问题和评论中发现了一个建议。建议先发出GET请求,然后在发送文件上传之前进行身份验证。这对我有用。以下是我的代码执行的步骤:
欢迎任何评论或解释。