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

StackOverflow https://stackoverflow.com/questions/23094

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Вы можете попробовать использовать 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.Контроль кэша, но оно устарело в пользу указанного выше свойства кэша:

Response.CacheControl = "No-Cache";

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

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) и снова нажимает кнопку Далее, затем приложение проверяет, были ли внесены изменения..Или, в идеале, это не имеет никакого значения жесткий изменяется до тех пор, пока пользователь не нажмет "ОК" в конце..Таким образом, все изменения сохраняются, и вы можете повторно заполнять форму на основе ранее введенных значений при загрузке каждый раз..

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

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() обработчик событий на главной странице, чтобы каждая страница в вашем приложении требовала возврата к серверу при нажатии кнопки "Назад".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top