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

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

22.08.2008 18:19:10
Steven de Salas 11.02.2015 23:06:08
5 ОТВЕТОВ
РЕШЕНИЕ

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

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 
7
23.08.2008 16:31:36

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

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

0
22.08.2008 18:22:21

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

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

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

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

6
22.08.2008 18:23:25
-1 Больше идеального ответа, чем прагматичного. Некоторые приложения изначально разрабатывались определенным образом, при работе в большой команде с ограниченным бюджетом будет довольно сложно продать ресурсы для изменения архитектуры без какой-либо очевидной выгоды для заинтересованных сторон. Кроме того, это не совсем ответ на вопрос.
Steven de Salas 11.02.2015 23:07:51

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

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

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

2
19.10.2008 22:47:52

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

0
11.02.2015 23:36:39