Каков наилучший способ справиться с кешем и кнопкой "Назад" браузера?

каков наилучший способ обработки пользователя, возвращающегося на страницу с кэшированными элементами в asp.net приложение? Есть ли хороший способ захватить кнопку "Назад" (событие?) и обрабатывать кэш таким образом?

5 ответов


вы можете попробовать использовать HttpResponse.Свойство кэша если это поможет:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
   //...
}

или может блокировать кэширование страницы с помощью HttpResponse.CacheControl, но его устарели в пользу свойства кэша выше:

Response.CacheControl = "No-Cache";

Edit: или вы действительно могли бы кранты и сделать все это вручную:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1 

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

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

т. е. если Шаг 3 выполняет некоторые чаги данных, то пользователь щелкает назад (к Шагу 2) и щелкает затем снова приложение проверяет, были ли внесены изменения.. Или, в идеале, он не делает каких-либо жесткий изменения до тех пор, пока пользователь не нажмет "OK" в конце.. Таким образом, все изменения сохраняются, и вы можете повторно заполнить форму на основе ранее введенных значений при загрузке каждый раз..

надеюсь, это имеет смысл:)


RFC 2616 §13.13 говорит, что история и Кэш-разные вещи. Не должно быть абсолютно никакого способа для кэша повлиять на кнопку "Назад".

Если какая-либо комбинация заголовков HTTP влияет на кнопку "Назад", это ошибка в браузере ...за одним исключением.

в HTTPS - браузеры интерпретируют Cache-control: must-revalidate как запрос на обновление страниц при использовании кнопки " Назад "(Mozilla называет это"глупым банковским режимом"). Это не поддерживается в простом HTTP.


лучший способ справиться с этим-вероятно, поместить директиву no-cache в ваш ASP.NET страницы (или главная страница, если вы ее используете). Я не думаю, что есть способ справиться с этим непосредственно в вашем ASP.NET код (так как решение кэша происходит на клиенте).

Что касается MVC, не знаю, как вы это сделаете (предполагая, что он отличается от веб-форм ASP.NET); я им не пользовался.


следующий код работал для меня в IE9+, FF21 и последнем Chrome:

Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();

Вы можете поместить это в Page_Load() обработчик событий в MasterPage, так что каждая страница в вашем приложении требуется поездка туда и обратно на сервер при нажатии кнопки "Назад".