Кэширование условного вывода в ASP.NET

У меня вопрос, как программно указать ASP.NET пропустить разрешение запроса из вывода cache.

Представьте, что у вас есть кэшированный вывод страницы (например, http: //domain/page.aspx ) посредством применения настроек политики кеширования от CMS к HttpResponse во время выполнения. Из расчета на запрос в зависимости от IE текущий пользователь аутентифицирован + член набора известных групп (или соответствует бизнес-логике), я хотел бы проинструктировать ASP.NET пропустить разрешение запроса из кэша вывода.

сценарий заключается в том, что в системе одновременно (или более) находятся два разных пользователя. Пользователь A аутентифицирован + является членом набора известных групп, а пользователь B является анонимным. Независимо от того, какая страница выводится в кэше, я хочу, чтобы аутентифицированный пользователь просматривал все страницы, как если бы кэширование вывода не было включено - никогда; в то же время я хотел бы, чтобы ASP.NET продолжал обслуживать выходные кэшированные страницы анонимным пользователям (или пользователям, которые не соответствуют бизнес-логике).

Типичное предложение - использовать VaryByHeader, VaryByParam и т. д. и загрязнять кеш вывода - нехорошо, но копаясь в модуле кэша вывода с помощью Reflector, Я заметил, что модуль кэша вывода пропускает текущий запрос в случае наличия пары известных заголовков "cache-control". Что касается заголовков, они отправляются из браузера, если пользователь принудительно отображает новую копию, нажимая F5 или ENTER в адресной строке.

Я просто устанавливаю Заголовок «cache-control» на «no-cache» в настраиваемом модуле http в событии, которое происходит перед событием ResolveRequestCache, на которое подписывается кэш вывода. Примерно так:

context.Request.Headers["Cache-Control"] = "no-cache";

Все прекрасно, однако, если установлена ​​политика кеширования HttpCachePolicy.SetValidUntilExpires (true), ASP.NET игнорирует ранее установленный заголовок запроса и обслуживает запрос из кэша вывода.

Как альтернатива Думаю, я мог бы написать дополнительный код в событии пост-обработки в том же самом http-модуле, чтобы гарантировать, что вызывается HttpCachePolicy.SetValidUntilExpires (false) в случае, если кэширование вывода было настроено, но я думаю, что это было бы более чистое решение, чтобы на самом деле иметь возможность указать ASP.NET просто пропустить разрешение запроса из кэша вывода. Я могу представить себе множество неудобных решений этого вопроса, но я ищу правильное.

Для справки, я пробовал большинство, если не все соответствующие методы класса HttpCachePolicy, например:

HttpResponse.Cache.SetNoServerCaching()).

5
задан Anders Borum 29 January 2011 в 14:43
поделиться