javascript - XmlHttpRequest 上传在两次使用之间暂停后挂起

标签 javascript file-upload xmlhttprequest

我正在开发一个带有文件上传部分的单页应用程序。 Knockout 用于将 View 绑定(bind)到 View 模型。此应用程序是使用 Windows 身份验证和 IE10 作为客户端的内网应用程序。如果用户最初上传文件,一切都很好。如果在 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 运行代码。

这不是跨站请求。

最佳答案

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

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

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

  1. 向服务器发送 HTTP GET 请求。为此,我在我的 ASP.NET MVC Controller 上创建了一个 NOP(无操作)操作。
  2. 当服务器响应 GET 请求时,执行文件上传调用。此事件中似乎没有任何挑战/响应。文件被发送到服务器,服务器相应地做出响应。

欢迎任何意见或解释。

关于javascript - XmlHttpRequest 上传在两次使用之间暂停后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542772/

相关文章:

JavaScript 将具有特定结构的对象转换为数组

javascript - 修复后 jQuery 验证器仍然标记错误

JavaFx WebView 不更新 XmlHttpRrequest 后台数据

javascript - 在不弹出的情况下创建 React App 中的工作箱

java - 单击图像的一部分即可找到匹配的图像

php - 在 PHP 中上传多张图片 - 超过 5 张

php - 在 PHP 4 中复制通过 PHP 的 HTTP Get 上传的文件

PHP move_uploaded_file() 错误?

javascript - 如何使用 jQuery 异步上传文件?

java - Rhino 中通过 HttpClient 的 XMLHttpRequest