【问题标题】:Internet Explorer: SCRIPT7002: XMLHttpRequest: Network Error 0x2f7d, Could not complete the operation due to error 00002f7dInternet Explorer:SCRIPT7002:XMLHttpRequest:网络错误 0x2f7d,由于错误 00002f7d 无法完成操作
【发布时间】:2013-07-14 23:10:24
【问题描述】:
这个问题快把我逼疯了。我们的网络应用程序使用 HTTP POST 来登录用户,现在 IE 10 正在中止连接并说:
SCRIPT7002: XMLHttpRequest: Network Error 0x2f7d, Could not complete the operation due to error 00002f7d.
这是我所有的细节
屏幕截图:
网络流量:
证书很好:
非常感谢任何帮助。我花了很多时间在这上面没有运气。正如您所料,这在 Chrome 和 Firefox 中运行良好。如果您需要有关正在发生的事情的更多详细信息,请告诉我。
谢谢,
【问题讨论】:
标签:
xmlhttprequest
internet-explorer-10
【解决方案1】:
添加延迟不是正确的解决方案。
这可能是因为 IE 在发出空正文请求时会将其视为网络错误。
尝试在服务器中添加一个空类作为参数,IE 应该会开始工作。
【解决方案2】:
[已解决]
我今天才观察到这个错误。对我来说,错误代码是不同的。
SCRIPT7002:XMLHttpRequest:网络错误 0x2efd,无法完成
由于错误 00002efd 导致的操作。
我是随机发生的,而不是所有时间。但它注意到的是,如果它来了,它会用于后续的 ajax 调用。所以我在 ajax 调用之间延迟了 5 秒,它解决了。
还必须在您的网络服务器上配置 CORS。
【解决方案3】:
我遇到了同样的问题,我终于解决了。出于某种原因,当使用用于接收登录凭据的 OWIN 中间件连接到 API 时,我在 IE 上收到了相同的错误。不过,在连接到任何其他类型的 API 时,它似乎工作正常。出于某种原因,即使我在 API 上启用了 CORS 的服务器端,它也不喜欢跨域请求。
无论如何,我都能使用xdomain 库解决问题。确保在加载任何其他 javascript 之前加载此脚本。
首先在您的 API 服务器的根目录上创建一个 proxy.html 页面并添加此代码。替换占位符网址。
<!DOCTYPE HTML>
<script src="//cdn.rawgit.com/jpillora/xdomain/0.7.3/dist/xdomain.min.js" master="http://insert_client_url_here.com"></script>
现在只需将其添加到您的客户端,替换指向 API 服务器上 proxy.html 页面的占位符 URL。
<script src="//cdn.rawgit.com/jpillora/xdomain/0.7.3/dist/xdomain.min.js" slave="http://Insert_Api_Url_Here.com/proxy.html"></script>
【解决方案4】:
证书吊销检查可能会阻止初始 JSON POST,但允许 GET 回调之后的后续请求
我们最近确定 URLMon 的忽略证书吊销检查失败的代码(Win8、Win7 和可能更早版本)不适用于内容上传(例如 HTTP POST)。因此,如果证书吊销检查失败,这对上传是致命的(例如,IE 将显示页面无法显示错误消息;其他客户端将显示不同的错误)。然而,这在现实世界中并不重要,因为在大多数情况下,用户首先从目标 HTTPS 站点执行下载(HTTP GET),结果服务器的证书被缓存,并带有“忽略撤销检查失败”豁免进程的生命周期,因此后续的 POST 会继承该标志并成功。如果当前进程中对 HTTPS 站点的第一个请求是上传(例如,在跨域 POST 请求中),则上传失败。
这是它的工作原理:
一点背景知识:当网络浏览器发起与网络服务器的 HTTPS 握手时,服务器会立即发送一个数字证书。服务器的主机名列在数字证书中,浏览器将其与它试图访问的主机名进行比较。如果这些主机名不匹配,浏览器会报错。
如果将单个 IP 配置为托管多个站点(有时称为“虚拟托管”),则匹配主机名要求会导致问题。通常,虚拟主机服务器会检查 HTTP Host 请求标头以确定要返回的 HTTP 内容。但是,在 HTTPS 情况下,服务器必须在从浏览器接收 HTTP 标头之前提供数字证书。 SNI 通过在与安全服务器的初始客户端握手的 SNI 扩展字段中列出目标服务器的主机名来解决此问题。虚拟主机服务器可能会检查 SNI 扩展以确定将哪个数字证书发送回客户端。
GET 可能是operation aborted 场景的受害者:
正在解析 HTML 文件,遇到一个脚本块。该脚本块包含内联脚本,该脚本创建一个新元素并尝试在解析器遇到结束 BODY 标记之前将其添加到 BODY 元素中。
<body>
<div>
<script>document.body.appendChild(newElem)</script>
</div>
</body>
请注意,如果我删除了 <div> 元素,则不会发生此问题,因为脚本块的直接父级将是 BODY,并且脚本块的直接父级不会出现此问题。
参考文献