Классический ASP: миграция с IIS 5 на IIS 6 вызывает проблемы с кэшированием изображений?

StackOverflow https://stackoverflow.com/questions/304749

  •  08-07-2019
  •  | 
  •  

Вопрос

Заранее извиняюсь за длинный вопрос.

На самом деле я программист баз данных, но унаследовал поддержку классического приложения интрасети ASP, которое недавно было перенесено с IIS 5 на новый сервер под управлением IIS 6.База пользователей насчитывает около дюжины, и все они используют IE 6.

Пользовательский интерфейс отображает иерархию элементов, возвращаемых из базы данных, используя комбинацию неупорядоченных списков HTML и JavaScript для скрытия/расширения ветвей при навигации пользователя.

Изображения отображаются рядом с элементами списка с помощью CSS (с использованием list-style-image), используя разные изображения для каждого типа элементов.Количество различных типов элементов (и, следовательно, изображений) в иерархии варьируется от 2 до 10.Иерархии варьируются от 20 до 200 элементов.

Проблема:

После перехода на IIS 6 несколько пользователей столкнулись с проблемой, которая, по-видимому, вызвана тем, что изображения не были правильно применены к одному или нескольким элементам иерархии;список отображается правильно, но одно или несколько изображений отсутствуют, и нажатие на любую ссылку приводит к загрузке пустой страницы.

Анализ сетевого трафика с помощью Wireshark и журналов IIS показывает, что проблема не на стороне сервера — весь контент корректно доставляется клиенту.

Похоже, проблема связана с кэшированием контента на клиенте:Похоже, что это чаще затрагивает пользователей, которые раньше не использовали приложение на своем нынешнем ПК или не использовали его в течение некоторого времени.Кроме того, я могу воспроизвести проблему примерно в одной попытке из трех, запустив сеанс, очистив кеш браузера и затем обновив страницу.Однако то же самое относится и к приложению, работающему в IIS 5, поэтому эта проблема могла существовать и до перехода на IIS 6, но случалась реже.Иногда, если я выхожу из сеанса примерно на 20 минут, браузер, кажется, «находит» недостающие изображения, и все работает нормально.

Если доступ к приложению осуществляется через локальный прокси-сервер (я использовал Fiddler), проблема никогда не возникает, хотя журнал подключений Fiddler показывает, что одно или несколько подключений к серверу для получения изображений были прерваны.Как и раньше, сетевой трафик показывает, что изображение было возвращено сервером.Однако использование прокси-сервера, похоже, позволяет IE находить другие успешно полученные копии изображения из кэша.

Я достиг точки, когда мои ограниченные знания об отладке проблем ASP/IIS исчерпаны.Удаление изображений в стиле списка из CSS решает проблему, но это должен быть крайний вариант, поскольку это усложняет использование приложения.

Любые предложения о том, как мне действовать, будут с благодарностью приняты.

Редактировать

AnonJr предполагает, что это проблема конфигурации клиента, поскольку все остальные компоненты работают правильно.

Я сбрасывал с дисконтуру простую проблему конфигурации клиента, потому что это единственное приложение, затронутое описанной проблемой, я протестировал все параметры под инструментами> Параметры Интернета> Временные файлы> Настройки без изменений в поведении.

Какие еще варианты конфигурации клиента мне следует рассмотреть?

Редактировать 2 - решение

Принятый ответ побудил меня искать известную проблему с IE6, запрашивающим несколько копий изображений, когда HTML генерируется из клиентского сценария - http://support.microsoft.com/default.aspx?scid=kb;en-us;319546.

В статье (указав, что такое поведение является «задуманным») предлагается обходной путь предварительного кэширования необходимых изображений путем загрузки их в невидимый DIV:

<DIV style='display:none'><IMG SRC='image.gif'></DIV>

Кажется, это работает для меня - я больше не могу воспроизвести проблему, очистив кеш браузера в середине сеанса, а трассировка Fiddler показывает, что каждое изображение запрашивается только один раз.

Я нашел одно предостережение, о котором раньше не знал;Кэш IE чувствителен к регистру, поэтому кэшированное изображение будет использоваться только в том случае, если регистр имени файла, указанный в невидимом DIV, совпадает с регистром, используемым в другом месте страницы.

Это было полезно?

Решение

Это похоже на ошибку IE6, когда браузер выполняет несколько запросов к одному и тому же ресурсу.Например, если контент требует отображения небольшого значка, повторяющегося в списке 20 раз, вместо того, чтобы просто получить это изображение один раз, он попытается получить его 20 раз.Хорошо, 19 ответов — 304 «Не изменено», но это все равно 19 дополнительных обращений к серверу.

В прошлом я обнаружил, что из-за таких чрезмерных запросов в конечном итоге у вас остается слишком много невыполненных запросов.В этот момент дальнейшие запросы к серверу даже для других страниц не могут получить ответ, по крайней мере, какое-то время.

Я не уверен, что это то, что происходит в вашем случае. Один из способов проверить это - вместо этого использовать IE7, чтобы проверить, возникнет ли у вас та же проблема. Эта ошибка была исправлена ​​в IE7.

Редактировать:Теперь, когда подтверждено, что проблема связана с ошибкой, о которой я говорил, вам следует также обратить внимание на ссылку в базе знаний на «короткую задержку».Основная проблема заключается в том, что для повторного использования только что полученного изображения браузеру необходимо выполнить работу, которая откладывается до завершения текущего фрагмента JavaScript.Требуется нечто большее, чем просто «короткая временная задержка», необходим асинхронный подход.

Я использовал подход display:none DIV для предварительной загрузки изображений, и это хорошо работает для работы в стиле AJAX.Однако если у вас есть код, работающий во время или до события загрузки окна, у вас все равно возникнет проблема при добавлении изображений в этот код.SetTimeout необходим для запуска дальнейшего кода после завершения события загрузки.

Другие советы

Возможно, вы захотите сосредоточить свое внимание на настройке параметров кэширования на стороне клиента.Если изображения отправляются сервером, то это вряд ли проблема IIS.Если HTML-код изображений отправляется в браузер, это не проблема ASP.Остается клиент.

Прокси-сервер может смягчать некоторые проблемы и/или влиять на то, как IE6 решит кэшировать изображения и т. д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top