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

Pet*_*one 5 jquery fiddler getscript internet-explorer-11

我正在使用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;
      ...
Run Code Online (Sandbox Code Playgroud)

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重命名为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无变化响应.

我有一种奇怪的感觉这是相关的为什么IE11创建空白的帖子请求,除非Fiddler正在运行?但我不能说为什么.

一旦文件在缓存中,它们的大小就不再表示,这就是为什么我运行预加载器 - 对于像我这样的SPA来说它是有效的安装.SPA相对于传统应用程序架构的强大论据.但是冗长的设置确实在某种程度上破坏了第一次体验.

Pet*_*one 0

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