XmlHttpRequest上载在使用之间暂停后挂起

时间:2014-03-20 19:06:39

标签: javascript file-upload xmlhttprequest

我正在处理带有文件上传部分的单页应用程序。 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中的代码。

这不是跨站点请求。

1 个答案:

答案 0 :(得分:3)

此问题似乎源于Internet Explorer使用NTLM身份验证的方式。 IE在从域接收HTTP 401响应时检测到站点正在使用NTLM身份验证。当发生像我问题中那样的大型POST操作时,IE将发送一个零字节POST请求,期望获得401返回,然后它可以使用用户凭据进行响应。这可以防止必须两次发送数据。

在我的设置中,我会收到401回来,IE似乎用凭据和文件上传响应服务器。无论出于何种原因,服务器都没有响应那个超时的请求。

我在其他StackOverflow问题和评论中发现了一个建议。建议先发出GET请求,然后在发送文件上传之前进行身份验证。这对我有用。以下是我的代码执行的步骤:

  1. 向服务器发送HTTP GET请求。我为此在ASP.NET MVC控制器上创建了一个NOP(无操作)操作。
  2. 当服务器响应GET请求时,执行文件上载调用。在这次活动中似乎没有任何挑战/回应。该文件将发送到服务器,服务器也会相应地做出响应。
  3. 欢迎任何评论或解释。