Сведения о вопросе

Fhohir

16:21, 28th August, 2020

Теги

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

Просмотров: 516   Ответов: 5

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



  Сведения об ответе

pumpa

02:04, 22nd August, 2020

Вы можете попробовать использовать свойство HttpResponse.Cache, если это поможет:

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: OR вы могли бы действительно сойти с ума и сделать все это вручную:

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 


  Сведения об ответе

P_S_S

06:53, 22nd August, 2020

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

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

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

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


  Сведения об ответе

lesha

06:37, 14th August, 2020

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

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

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


  Сведения об ответе

VERSUION

23:35, 20th August, 2020

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

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


  Сведения об ответе

davran

07:16, 26th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться