IIS7.5 Ongyscachemodule Kernel кэширует «публичный» игнорирующий URL
-
09-10-2019 - |
Вопрос
Имейте какое-то странное поведение в отношении выходной кэширования в приложении 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 устанавливает заголовок Cache-Control для общественности, либо на будущую дату для истечения истечения или значение максимального возраста.
Посещение www.first-domain.com выводит страницу, которая успешно пишет www.first-domain.com '.
Однако посещение www.second-domain.com выводит страницу, которая пишет www.first-domain.com '.
Исследование неисправностей-запрос-следов, System.Web.caching.Outputcachemodule нашла кэшированный выход (даже если файлы .Config повернули функцию выключенного), кэш совпадал, даже если имя хоста URL-адреса запроса разные, и, следовательно, Второй запрос выводится результаты первого запроса на другой домен, пока установлен максимальный возраст / срок действия, прежде чем появится правильная страница для второго домена.
Либо установка Cache-Control для частного или удаления модуля «OutputCache» в Web.config решает проблему, сохраняя при сохранении правильных заголовков Cache-Control, отправленных в браузер, но, очевидно, я не могу воспользоваться кешированием ядра, когда Мне это надо.
Я не могу найти какую-либо документацию MSDN о том, как настроена выводкаCachemodule.
Кто-нибудь еще испытывал этот вопрос, как я могу включить кэширование ядра и позволить ему учитывать имя хоста URL (без разделения приложения на разные сайты в IIS).
Спасибо.
Обновлять:
Добавление SetSlidingExpiration не имеет никакого эффекта, так как кэш ядра все еще кэширует вывод независимо от права хоста запроса. Единственный сценарий сейчас - либо отключить выходную кэширование, либо запускать дубликат экземпляра приложения на каждом домене, он будет работать - с учетом выпуска сервера, это приведет к повышению производительности, полученного в использовании выходных кэширования, мы решили Чтобы отключить выходное кэширование для этого приложения.
Решение
После 9 месяцев нет ответа, и никакого решения не было найдено, только обходной путь, возможно, это будет исправлено в следующей версии IIS более 7,5 ...
--
Добавление SetSlidingExpiration не имеет никакого эффекта, так как кэш ядра все еще кэширует вывод независимо от права хоста запроса. Единственный сценарий сейчас - либо отключить выходную кэширование, либо запускать дубликат экземпляра приложения на каждом домене, он будет работать - с учетом выпуска сервера, это приведет к повышению производительности, полученного в использовании выходных кэширования, мы решили Чтобы отключить выходное кэширование для этого приложения.
Другие советы
У меня была очень похожая проблема, и никаких решений здесь не помогло.
TLDR: Насильно удалить OutputCache
модуль на Web.config
было единственное решение, которое я нашел.
Мой сценарий был немного другим.
У меня есть CORS, установленные в Application_BeginRequest
, отвечая Access-Control-Allow-Origin
для определенных хозяев, которые называют меня (установка его *
не был надежен).
Мой контроллер также устанавливает Cache-control: public
для это ответов.
Что я обнаружил
Всякий раз, когда я установил Cache-control: public
, IIS насильно кэширует ответ. Точка останова любой Application_BeginRequest
или мой контроллер никогда не ударил второй раз.
Отключение вывода и кэширования ядра через менеджер IIS, как видно ниже у меня будет ударить Application_BeginRequest
точки останова, но никогда не забрал меня в контроллер. Что-то все еще кэшировало ответы.
эта статья Предлагаемое удаление модуля вывода данных из IIS поможет.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="OutputCache" />
</modules>
</system.webServer>
Это позволило мне ударить моим контроллером, наконец.
Что бы помочь еще больше
Если кто-то из MS или не мог светить свет, есть ли способ изменить это поведение. Outputcache может быть полезен в некоторых частях приложения и ненужных в других.
Остерегаться
Может быть, я (мы?) Решит неправильную проблему здесь.
Возможно, IIS пробил кэширование в этом сценарии, потому что он должен. Возможно, прокси по пути между моим сервером, и пользователь ведет себя так же, как это точный сценарий, и если это так, то работая вокруг этого на IIS неверно. Я должен понять это, и, возможно, вы тоже должны.
У меня есть подобная проблема. Я использую пользовательский Rewriter URL. У меня есть страницы example.com/articles и example.com/art-any_id.html. Оба URL-адреса на Статьи.aspx (во втором примере как Starl.aspx? Id = any_id). Он работал нормально с режимом ASP.NET 2.0 и Classic Pipeline. После того, как мы изменили его в ASP.NET 4 и встроенный режим, у нас есть странное поведение: оба возврата URL идентично вывод. Это была какая-либо страница, такая как example.com/art-any_id.html.
Теперь мы удалили <add extension=".html" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
из раздела <caching enabled="true" enableKernelCache="true">
И это хорошо работает. Я не понимаю, почему http.sys кэширует это.
Вы находили какие-либо объяснения?