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

时间:2015-04-08 03:19:06

标签: jquery internet-explorer-11 fiddler getscript

我正在使用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是有效的。 调用代码中没有错误,jQuery在将其解析为脚本之前未能获得整个响应。

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

只有IE11在工作时才会发生这种情况,并且当流量通过Fiddler路由时问题就会停止显现。它在家里的IE11上根本不会发生。将'knockout-3.2.0.js',更改为'knockout-3.2.0.debug.js',会导致敲除加载顺利进行,但bootstrap.js不会缩小并且确实会播放,因此不会像没有换行那样简单。我认为这可能是由名称更改修复的某种服务器缓存问题(它不能是浏览器缓存问题,因为getScript应用了cache-buster参数)但我尝试重命名knockout-3.2。 0.js to knockout-3.2.0.min.js并没有任何区别。

症状相似的问题:


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

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

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

如果微软的任何人希望进行调查(如果答案是否定的话,我不会感到惊讶,这是一个有点边缘的情况)...我有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相对于传统应用程序架构的强大论据。但是,冗长的设置确实在第一次体验时有所损失。

1 个答案:

答案 0 :(得分:0)

通过在IIS中禁用压缩来解决此问题。