использовать ту же страницу из кеша браузера, если строка запроса отличается

Страница ASP.NET MVC2 используется для отображения порядка в браузере, как описано в Как заполнить заголовок документа из данных jqgrid

при загрузке страницы javascript извлекает правильный документ из браузера и привязывает его к элементам страницы.

идентификатор документа указывается в строке запроса, например:

www.mysite.com/GetDocument?Id=1
www.mysite.com/GetDocument?Id=2

документ кешируется в браузере:

[OutputCache(Location = OutputCacheLocation.Downstream, Duration = 20 * 60,VaryByParam = "*")]
public ActionResult Index(int id) 

Однако кеш браузера не используется, поскольку для каждой строки запроса кешируются разные страницы. Как заставить Borwser кешировать страницу, которая не зависит от параметра id в строке запроса? Или лучше передать id в параметре post?


person Andrus    schedule 28.10.2012    source источник


Ответы (1)


Вы должны изменить свойство VaryByParam.

Если id - единственный возможный ключ строки запроса, вы можете написать:

[OutputCache(Location = OutputCacheLocation.Downstream, Duration = 20 * 60,VaryByParam = "none")]
public ActionResult Index(int id) 

поэтому будет создана только одна кешированная страница.

Если могут быть другие параметры, вы можете определить их в VaryByParam:

[OutputCache(Location = OutputCacheLocation.Downstream, Duration = 20 * 60,VaryByParam = "name;age")]
public ActionResult Index(int id) 
person tpolyak    schedule 28.10.2012
comment
Спасибо. После нажатия F5 старые данные все равно возвращаются. Похоже, это также происходит на сервере и возвращает кешированные данные, если в браузере нажата клавиша F5. Как исправить ? - person Andrus; 29.10.2012
comment
@Andrus: Использование [OutputCache(...)] следует за кешированием данных на сервере. Так что неважно, что будет делать на клиентской части (например, F5). Он просто отправит запрос на сервер, и сервер вернет ответ из кеша, пока не истечет интервал Duration. - person Oleg; 30.10.2012
comment
@Oleg: Downstream означает, что кэш вывода может храниться на любых устройствах с поддержкой кеширования HTTP 1.1 кроме исходного сервера (msdn.microsoft.com/en-us/library/). Таким образом, это не кешируется на сервере - person Andrus; 30.10.2012
comment
@Andrus: Я не знаю никаких директив кеширования HTTP 1.1 (см. здесь), что позволяет реализовать VaryByParam = "name;age" на стороне клиента. Поэтому я думаю, что такое кеширование может быть реализовано только на сервере (веб-сервере или прокси-сервере, если они есть). Вы можете прочитать здесь дополнительную информацию об использовании программного подхода вместо декларативного. - person Oleg; 30.10.2012
comment
@ Олег: Большое спасибо. Я, вероятно, должен передать документ в почтовый буфер и удалить его из строки запроса. Надеюсь, в этом случае просмотрите кеши. - person Andrus; 30.10.2012
comment
@Andrus: Пожалуйста! Я уверен, что после некоторых экспериментов вы найдете решение проблемы. - person Oleg; 30.10.2012
comment
@ Олег. Спасибо. Не могли бы вы разобраться в этой проблеме: stackoverflow.com/questions/13103544/ Это, вероятно, очень просто для вас. - person Andrus; 31.10.2012
comment
@Andrus: Вы сформулировали текст вопроса слишком непонятно для людей, у которых нет проблемы. Вероятно, вам следует включить изображения, которые ясно показывают проблему. Кроме того, было бы полезно создать демонстрацию на jsfiddle.net, демонстрирующую проблему. - person Oleg; 31.10.2012
comment
@Oleg: Большое спасибо. Я обновил вопрос в stackoverflow.com/questions/13103544/ и добавленные изображения - person Andrus; 01.11.2012
comment
@Andrus: Я опубликовал ответ на ваш вопрос. - person Oleg; 11.11.2012