Неполные ответы XHR от IIS с сжатием

Я загружаю скрипты с помощью 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 не получает весь ответ, прежде чем разбирать его как script.

Указанный на том же общедоступном сервере, $.getScript() выдает ошибку, хотя err.status сообщает 200 OK. Проверка данных показывает, что она усечена, и ошибка, вероятно, является сбоем разбора JS в результате усечения.

Это происходит только при работе IE11, и проблема перестает проявляться, когда трафик маршрутизируется через Fiddler. Это не происходит вовсе на IE11 дома. Изменение 'knockout-3.2.0.js', на 'knockout-3.2.0.debug.js', приводит к тому, что нокаут загружается без заминки, однако bootstrap.js не минимизируется, и он воспроизводится, поэтому он не так прост, как без разрыва строки. Я думал, что это может быть какая-то проблема кеширования сервера, исправленная изменением имени (это не может быть проблемой кэширования браузера, поскольку getScript применяет параметр кэша-бастера), но я пробовал переименовать knockout-3.2.0.js в нокаут-3.2.0.min.js, и это не имело значения.

Вопросы со сходными симптомами:


Я подтвердил, что IE дома и на работе были 11.0.9600.17690 обновлениями KB3032359.

Проблема исчезла, когда я отключил сжатие IIS.

Я не знаю, было ли это статическое или динамическое сжатие, потому что я отключил их одновременно.

Если кто-либо из Microsoft хочет исследовать (я не удивлюсь, если ответ будет отрицательным, это немного красное дело)... У меня есть файлы PCAP с обрывом обмена между клиента и сервера.

Диагностическое резюме

  • Это не сеть, она терпит неудачу с альтернативным маршрутом через мой телефон.
  • это не версия IE, то же IE-сборка дома не терпит неудачу
  • Это не платформа (как на Win81), хотя это могут быть драйверы сетевого оборудования.
  • это не IIS, работает дома и на моем WinPhone81 и для всех других браузеров
  • это IIS, отключая сжатие сервера.
  • это не IIS, сжатие отлично работало для других браузеров, хотя я не думал, чтобы захватить трафик браузером, который работал с сжатием на
  • вмешательство Fiddler разрешило проблему, пока сжатие было активным
  • Это не проблема кэширования браузера, getScript поставляет параметр кэша-buster, и когда я намеренно разрешал кэширование, в файлах захвата было очевидно, что в качестве ответов HTTP без изменений.

У меня такое странное чувство, что это связано Почему IE11 создает пустой почтовый запрос, кроме случаев, когда Fiddler работает?, но я не мог сказать, почему.

Как только файлы находятся в кеше, их размер перестает обозначаться, поэтому я запускаю предварительный загрузчик - для SPA, подобного моему, он эффективно устанавливает. Мощный аргумент в пользу SPA над традиционными архитектурами приложений. Но длительная установка несколько раз приносит первый опыт.

5
08 апр. '15 в 6:19
источник поделиться
1 ответ

Проблема разрешена путем отключения сжатия в IIS.

1
09 апр. '15 в 8:19
источник

Посмотрите другие вопросы по меткам или Задайте вопрос