Очистка IIS Cache из приложения MVC3 - PullRequest
3 голосов
/ 26 января 2012

Мне нужно очистить кэш IIS на моем сервере. Точная причина подробно описана ниже;но причина не имеет значения.Я на 100% уверен, что это решение мне нужно;как подробно описано ниже, я использовал процесс исключения, чтобы определить, что это действительно проблема, с которой я сталкиваюсь, и решение, которое мне нужно.


У меня есть приложение MVC3, которое можно редактировать (с поддержкой скиновархитектура).Думайте об этом как Wordpress;Пользователи могут разработать тему, скачать ее и активировать на своем сайте.Тема точно контролирует окончательный вывод HTML.Это чрезмерное упрощение, поскольку я предоставляю API с полезными функциями для использования темами.

В любом случае, пользователи могут изменять тему сайта.Тема в настоящее время хранится в статической переменной .Когда отображается страница представления, имя темы определяет местоположение файла макета (который содержит ссылки на файлы CSS и т. Д.) И файлов представления.Тема - это настройка, которая сохраняется в БД.

Например, если у меня есть тема под названием «Foo», то при запросе страницы / Admin я могу использовать /Themes/Foo/Admin.cshtml.Если у меня есть другая тема с именем «Bar», в которой нет этого файла, то для / Admin она может запросить /Themes/Bar/Generic.cshtml в качестве макета.

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

В любом случае, IIS7 по умолчанию использует кэширование.По сути, мне нужен способ очистки кеша, когда пользователь меняет тему. В настоящее время этого не происходит, и пользователи продолжают видеть старую тему, пока кеш (каким-то образом) сам не истекает.

Я не с использованием кэширования вывода или любой другой формы явного кэширования;это «ванильное» приложение ASP.NET MVC3 с точки зрения кэширования (то есть я не добавлял / не настраивал никакого кэширования).IIS7 имеет свое собственное кэширование по умолчанию.Я знаю это, потому что если я отключу кэширование вывода в IIS7 для своего сайта, я всегда буду видеть правильную тему после изменения.

Как очистить кэш?Другие вопросы SO указывают на использование Cache.blah, и я попытался использовать HttpContext.Current, но во время тестов это значение равно нулю (с использованием средства тестирования VS) - поскольку конвейер ASP.NET используется не полностью.

ToОбъясните, в интеграционном тесте я в основном:

  • Перейти к localhost / Test /
  • Войти (отправить значения в формы)
  • Изменить тему наПерейдите на нужную страницу и щелкните по правой ссылке
  • Запросить другую страницу
  • Проверьте, изменилась ли тема (в зависимости от имени файла макета / CSS).

Все это делается с помощью кода;Я использую порт C # HtmlUnit, и, наряду с развертыванием моего приложения в / Test в IIS, я могу по существу просматривать его как конечный пользователь.

В настоящее время этот тест проходит около 50% времени.Проблема в том, что IIS кеширует результаты, и я не могу точно сбросить кэш на стороне сервера.

Опять же, я не говорю об очистке сеанса или кэша на стороне пользователя;Сам IIS является виновником кеширования моего приложения.Также я не хочу полностью отключать кеш через настройки IIS, а) потому что я не могу заставить людей, которые устанавливают мое приложение, делать это, и б) потому что кэширование это хорошо.

Так как я могу заставитьочистка кеша на сервере?

Например, я пробовал программно касаться web.config;это работает, но перерабатывает мой пул приложений и, таким образом, убивает мои статические переменные;каждый запрос означает перезагрузку всех статических переменных из БД, что убивает мою производительность.

Ответы [ 5 ]

2 голосов
/ 11 февраля 2012

Как вы и просили, я исправил этот пост:

Вы можете использовать кэш вывода, вы говорите, что выбранная тема хранится в базе данных (например, настройки для сайта). Ну, я бы добавил еще один столбец с, скажем, GUID, а затем использовал бы его в качестве значения Varby Custom.

Ваш файл global.asax сможет выполнить код:

void Page_Init() {

///code here to get the GUIDforthissitestheme

var outputCacheSettings = new OutputCacheParameters() {
    Duration = Int32.MaxValue, //think its maxvalue
    VaryByCustom = GUIDforthissitestheme
};
InitOutputCache(outputCacheSettings); 

}

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

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

надеюсь, это поможет

0 голосов
/ 17 февраля 2012

Просто коснитесь web.config.Это самый простой и надежный способ.Программная очистка пула приложений излишня.

Если у вас возникла проблема с определением местоположения web.config в тестовой среде (поскольку System.Web.HttpRequest.Current имеет значение null и похоже на Server), вы всегда можете использоватьфайл app.config для указания местоположения.

Опять же, нет другого простого способа сделать это;даже отключение кэширования вывода, как упоминалось в вопросе, трудно сделать только с помощью web.config.

0 голосов
/ 15 февраля 2012

Я не думаю, что подход, упомянутый для тем, является правильным. Если мы используем переменные STATIC, то это повлияет на всех пользователей и все страницы. (Что, конечно, не требуется.)

Мы можем думать о двух подходах,

  1. Используйте имя темы в URL и сделайте его в качестве prat, если RouteData. Таким образом, URL "http://myHost/BLUE/.." вернется в СИНИЙ теме, а" http://myHost/RED/.." вернется в КРАСНОЙ теме. Если пользователь изменит тему, URL будет обновлен.

  2. Проблема с вышеуказанным подходом заключается в следующем просмотре пользователем, он будет загружать тему по умолчанию. Поэтому лучшим подходом будет сохранение темы как части пользовательских предпочтений. После входа в систему прочитайте тему из БД и установите значение RouteData.

0 голосов
/ 15 февраля 2012

Проблемы, которые вы описываете, очень похожи на проблему кэширования на стороне клиента.Вы проверили это с помощью HTTP-прокси, например Fiddler , чтобы убедиться, что это кэшируется на клиенте?

Если вы видите HTTP 304 после смены шаблона, вы можете попробовать настроить IIS (или шаблон вашего сайта) для отключения кэширования на стороне клиента.

0 голосов
/ 11 февраля 2012

Установите «Правило кэширования» в функции «Кэширование вывода», когда «Мониторинг кэша файлов» установлен на «Использование уведомления об изменении файла». Затем «коснитесь» темы изменения файлов, из кода .net, который вы можете сделать:

System.IO.File.SetLastWriteTimeUtc(fileName, DateTime.UtcNow);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...