Skip to main content
 首页 » 编程设计

jquery之来自 IIS 的压缩 XHR 响应不完整

2026年09月08日2zhwl

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

这是加载程序代码的一个片段,它的值(value)。

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; 
      ... 

Recommended syntax for getScript only takes one parameter. Either it's a valid URL or not. Because the start of the resource is returned we know the URL is valid . There is no error in the invoking code, jQuery is failing to get the entire response before parsing it as a script.

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

这只发生在 IE11 工作时,当流量通过 Fiddler 路由时,问题就不再出现。在家里的IE11上根本不会出现这种情况。将 'knockout-3.2.0.js', 更改为 'knockout-3.2.0.debug.js', 会导致 knockout 顺利加载,但 bootstrap.js没有缩小并且确实播放了,所以它不像没有换行那么简单。我认为这可能是某种通过名称更改解决的服务器缓存问题(它不可能是浏览器缓存问题,因为 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 提供了一个缓存破坏器参数,当我故意允许缓存时,它在捕获文件中很明显是 http 无更改响应。

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

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

请您参考如下方法:

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