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

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

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

Ответы [ 2 ]

1 голос
/ 26 ноября 2008

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

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

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

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

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

0 голосов
/ 22 ноября 2008

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

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

...