【问题标题】:Incomplete XHR responses from IIS with compression来自带有压缩的 IIS 的不完整 XHR 响应
【发布时间】:2015-04-08 03:19:05
【问题描述】:

我正在使用 jQuery ajax 加载脚本。

这是加载程序代码的一个片段,值得一看。

var resources = ['knockout-3.2.0.js', 'fonts/fontawesome-webfont.eot', ... ];
var retryCount = 0;
load(0);
function load(i) {
  if (i == resources.length) {
    $("#progBar").width("100%");
    $("#progCaption").text("executing App/main...")
    var requireScript = document.createElement('script');
    requireScript.setAttribute("type", "text/javascript");
    requireScript.setAttribute("src", "Scripts/require.js");
    requireScript.setAttribute("data-main", "App/main");
    head[0].appendChild(requireScript);
  }
  else {
    $("#progBar").width(100 * i / resources.length + "%");
    var r = resources[i];
    switch (r.substring(r.lastIndexOf('.'))) {
      case ".js":
        $("#progCaption").text(r);
        $.getScript('Scripts/' + r)
        .done(function (data) {
          retryCount = 0;
          load(++i);
        })
        .error(function (err) {
          if (err.status == 404 || retryCount == 3) {
            load(++i);
          } else {
            retryCount++;
            console.log('Retry ' + r);
            load(i);
          }
        });
        break;
      ...

getScript 的推荐语法只接受一个参数。它是否是有效的 URL。因为返回了资源的开头,所以我们知道 URL 是有效的。 invoking 代码中没有错误,jQuery 在将其解析为脚本之前未能获取整个响应。

指向同一个面向公众的服务器,即使 err.status 报告 200 OK,$.getScript() 也会引发错误。查资料显示被截断,错误可能是截断导致的JS解析失败。

这仅在 IE11 工作时发生,并且当流量通过 Fiddler 路由时问题停止显现。它根本不会发生在家里的 IE11 上。将'knockout-3.2.0.js', 更改为'knockout-3.2.0.debug.js', 会导致淘汰赛加载顺利,但是bootstrap.js 并没有缩小并且确实可以播放,所以它不像没有换行那么简单。我认为这可能是通过名称更改修复的某种 server 缓存问题(它不可能是浏览器缓存问题,因为 getScript 应用了缓存破坏器参数)但我尝试重命名 knockout-3.2。 0.js 到 knockout-3.2.0.min.js 并没有什么区别。

有类似症状的问题:


我确认家里和工作的IE都是11.0.9600.17690更新KB3032359。

当我禁用 IIS 压缩时问题消失了。

我不知道是静态压缩还是动态压缩,因为我同时关闭了它们。

如果 Microsoft 的任何人希望调查(如果答案是否定的,我不会感到惊讶,这有点极端)...我有 PCAP 文件表明两者之间的交换失败客户端和服务器。

诊断总结

  • 不是网络,它通过我的手机的备用路由失败
  • 不是IE的版本,同样的IE在家里建不会失败
  • 虽然可能是网络硬件驱动程序,但不是平台(都在 Win81 上)
  • 它不是 IIS,可以在家里和我的 WinPhone81 以及所有其他浏览器上工作
  • 它是 IIS,关闭服务器压缩修复它
  • 这不是 IIS,压缩在其他浏览器上工作得很好,虽然我不认为使用支持压缩的浏览器来捕获流量
  • 插入 Fiddler 解决了压缩处于活动状态时的问题
  • 这不是浏览器缓存问题,getScript 提供了一个 cache-buster 参数,当我故意允许缓存时,它在捕获文件中很明显是 http 无变化响应。

我有一种最奇怪的感觉,这与Why does IE11 create blank post request except when Fiddler is running? 相关,但我无法说出原因。

一旦文件在缓存中,它们的大小就不再有意义,这就是我运行预加载器的原因 - 对于像我这样的 SPA,它可以有效地安装。 SPA 优于传统应用程序架构的有力论据。但冗长的设置确实会影响第一次体验。

【问题讨论】:

  • 它发生在特定脚本或所有脚本中?
  • 它发生在大型、缩小的脚本中。特别是 bootstrap.js 和 knockout-3.2.0.js - 有趣的是,knockout-3.2.0.debug,js 更大,处理起来没有任何问题。
  • 另一个用于#IEProblems 的堆栈,哈哈
  • 也许你应该把它放在 jQuery 错误中?三个浏览器都有问题。由于历史上较高的市场份额,IE 问题在历史上备受瞩目。坦率地说,我在使用 Firefox 时遇到了更多麻烦。
  • 您是否对此进行了深入研究,我在使用 Asp.NET、MVC 和 IIS 8.5 为 jQuery 和 jQuery UI 提供服务时遇到了同样的问题。关闭动态内容压缩为我解决了这个问题,但我仍在寻找为什么动态内容压缩会导致 IIS 特别是在提供这两个文件时出错的根本原因。

标签: jquery internet-explorer-11 fiddler getscript


【解决方案1】:

通过在 IIS 中禁用压缩解决了该问题。

【讨论】:

  • 显然,这是一个令人不快的解决方法。如果您可以与我共享 PCAP(在 Fiddler 中使用帮助 > 发送反馈),我可以将它们发送给 MSFT 内部的合适人员。
猜你喜欢
  • 2023-03-25
  • 2011-06-01
  • 2015-10-14
  • 2018-10-10
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多