IIS7.5 OutputCacheModule кеширует «публичный» URL, игнорирующий - PullRequest
3 голосов
/ 10 января 2011

Есть странное поведение в отношении кэширования вывода в приложении ASP.NET 4 на IIS 7.5.Мне удалось повторить проблему просто на других пустых установках, я уверен, что это ошибка, но не знаю, как сообщить об этом в Microsoft.

Сайт в IIS реагирует на более чем 1 домен,.NET-приложение проверяет имя хоста и соответственно создает содержимое.Например, он может напечатать имя URL запроса на пустой странице.Например, www.first-domain.com и www.second-domain.com

В файле web.config есть соответствующие кэширование, urlCompression и httpCompression, отключенные в узле system.webServer.

Страница aspx устанавливает общедоступный заголовок элемента управления кэшем с будущей датой истечения срока действия или значением максимального возраста.

При посещении www.first-domain.com выводится страница, которая успешно пишет'www.first-domain.com'.

Тем не менее, посещение www.second-domain.com приводит к появлению страницы с надписью "www.first-domain.com".

Проверка неисправности-request-traces, System.Web.Caching.OutputCacheModule обнаружил кэшированный вывод (даже если файлы .config отключили функцию), кэш соответствовал, даже если имя хоста URL запроса отличается, и, таким образом, второй запрос будетвыводить результаты первого запроса в другой домен до тех пор, пока не будет задан максимальный возраст / срок действия, до появления правильной страницы для второго домена.

Either установка для элемента управления кэша значения private или удаление модуля «OutputCache» в web.config решает проблему, сохраняя правильные заголовки элемента управления кэшем, отправляемые в браузер, но, очевидно, я не могу воспользоваться преимуществами кэширования ядра, когдаМне это нужно.

Я не могу найти документацию MSDN о том, как настроен модуль OutputCacheModule.

Кто-нибудь еще сталкивался с этой проблемой, как я могу разрешить кэширование ядра и позволить емуна URL учетной записи Имя хоста (без разделения приложения на разные сайты в IIS).

Спасибо.

Обновление:

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

Ответы [ 3 ]

2 голосов
/ 05 августа 2016

У меня была очень похожая проблема, и никакие решения здесь не помогли мне.

TLDR : Принудительное удаление модуля OutputCache на Web.config было единственным решением, которое я нашел.

Мой сценарий был немного другим.

У меня установлен CORS в Application_BeginRequest, отвечая на Access-Control-Allow-Origin для определенных хостов, которые мне звонят (установка на * не была надежной).

Мой контроллер также устанавливает Cache-control: public для его ответов.

Что я нашел

Всякий раз, когда я устанавливаю Cache-control: public, IIS принудительно кэширует ответ.Точки останова на Application_BeginRequest или на моем контроллере никогда не срабатывали второй раз.

Отключение вывода и кэширование ядра с помощью диспетчера IIS, как видно ниже , заставило бы меня попасть на точки останова Application_BeginRequest, ноникогда не заводил меня в контроллерЧто-то еще было кеширование ответов.disabled output caching and kernel caching on inetmgr

В этой статье предлагается удалить модуль OutputCache из IIS.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="OutputCache" />
  </modules>
</system.webServer>

Это позволило мне ударить мой контроллер, наконец.

Что помогло бы еще больше

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

Остерегайтесь

Возможно, я (мы?) Решаю не ту проблему здесь.

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

2 голосов
/ 08 октября 2011

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

-

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

0 голосов
/ 22 мая 2013

У меня похожая проблема.Я использую пользовательский URL Rewriter.У меня есть страницы example.com/articles и example.com/art-ANY_ID.html.Оба URL-адреса отображаются на article.aspx (во втором примере как article.aspx? Id = ANY_ID).Он отлично работал с ASP.NET 2.0 и классическим конвейерным режимом.После того, как мы изменили его на ASP.NET 4 и интегрированный режим, мы получили странное поведение: оба URL возвращают одинаковый вывод.Это была любая страница наподобие example.com/art-ANY_ID.html.

Теперь мы удалили <add extension=".html" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" /> из раздела <caching enabled="true" enableKernelCache="true">, и все отлично работает.Я не понимаю, почему http.sys кеширует его.

Нашли какие-нибудь объяснения?

...