2016-11-01 30 views
8

В приложении ASP.NET Core у меня есть метод действий, который возвращает некоторые данные. Я хотел кэш этих данных на стороне клиента. Поэтому на основе documentation here я могу использовать атрибут ResponseCache для метода действия. Этот атрибут добавляет Cache-Control заголовка в ответАтрибут ResponseCache не кэширует данные на стороне клиента

Кэширования Response относится к заданию заголовков кэша, связанным с HTTP ответов, сделанных действиями ASP.NET MVC ядра. Эти заголовки указывают, как вы хотите, чтобы клиентские и промежуточные (прокси-серверы) кэшировали ответы на определенные запросы (если вообще). Это может уменьшить количество запросов , которые клиент или прокси делает на веб-сервере, поскольку в будущем запросы на одно и то же действие могут быть отправлены из кеша клиента или прокси .

также

кэширование ответа не кэшировать ответы на веб-сервере. Он отличается от выходного кэширования, который будет кэшировать ответы в памяти на сервере в более ранних версиях ASP.NET и ASP.NET MVC.

Так что это как мой метод действия выглядит

public class LookupController : Controller 
{ 
    [HttpGet] 
    [ResponseCache(Duration = 120)] 
    public IEnumerable<StateProvinceLookupModel> GetStateProvinces() 
    { 
     return _domain.GetStateProvinces(); 
    } 
} 

Тогда я вызвать метод, используя браузер в качестве http://localhost:40004/lookup/getstateprovinces Здесь в заголовки запроса и ответа

enter image description here

Обратите внимание, что ответ Заголовки имеют Cache-Control: public,max-age-120, как и ожидалось. Однако, если обновить страницу с помощью F5 (до 120 секунд), точка останова отладчика внутри метода GetStateProvince всегда будет удалена. Это означает, что он не передает данные на стороне клиента.

Есть ли что-то еще, что мне нужно сделать, чтобы включить кеширование на стороне клиента?

Обновление Я пробовал использовать IE, Chrome, а также POSTMAN без везения. Каждый раз, когда я набираю URL-адрес в адресной строке или удаляю обновление, клиент (это браузер или почтальон) делает метод вызова к действию.

+0

@dotnetstep прав, а также f5 (обновление страницы) уже кэш брокера на стороне клиента, как я знаю. просто введите адрес в адресной строке и введите. что, как я проверяю кеш – ergen

+0

@ergen, я также пробовал с POSTMAN без везения – LP13

+0

Не знаю, кто такой человек. давайте проясним: попробуйте просто перейти к URL-адресу в браузере вместо обновления. refresh - это брокер, во-вторых, тип файла важен для кэширования клиентов. например, вы не за исключением вашего 1000 мб видео для кэширования. вы кешируете только .json, так что это не имеет значения. то я уверен, что кеш будет работать, когда вы используете URL-адрес, например licalhost/lookup/getstateprovinces.json. сосредоточиться на расширении и кэшируемых файлах на стороне клиента. даже если вы добавите заголовок в ответ, браузер может не знать ваш файл как статический файл из-за расширения – ergen

ответ

0

Прежде всего, я хочу кое-что уточнить, и я уверен, что вы уже это знали.

  1. ResponseCache не равно OutputCache в любом случае.

  2. ResponseCache соответствует моему заголовку мышления, но он не кэширует ничего на стороне сервера.

Теперь, если вы хотите, чтобы кеш был таким же, как OutputCache, вам, возможно, придется использовать предварительный выпуск 1.1, который только что выпущен.

ASP.net core 1.1 Предварительный релиз

https://blogs.msdn.microsoft.com/webdev/2016/10/25/announcing-asp-net-core-1-1-preview-1/

Они вводят новый ответ Caching Middleware. Ответ Кэширование промежуточного программного обеспечения

Демонстрационная версия доступна здесь. https://github.com/aspnet/ResponseCaching/blob/dev/samples/ResponseCachingSample/Startup.cs

+0

Я никогда не говорил, что я хочу кэшировать на стороне сервера, как outputcache, на самом деле я делаю не хотите кэшировать на стороне сервера, я хочу кэшировать данные на стороне клиента. и thats, что атрибут ResponseCache должен делать – LP13

4

Фактически Атрибут ResponseCache работает по назначению.
Разница в том, что ответ кэшируется, если вы перемещаетесь по страницам своего сайта (case 1) или используйте кнопки «назад» и «вперед» (не при обновлении страницы).

В качестве примера случае 1, я следующее:

Как вы увидите в статье Response Caching in ASP.Net Core 1.1, сказано следующее:

Во время сеанса браузера, просмотр нескольких страниц в вебе-сайте или с помощью назад и кнопка вперед, чтобы посетить страницы, содержание будет подано от кеш локального браузера (если не истек).
Но когда страница обновляется через F5, запрос будет отправлен на сервер, и содержимое страницы будет обновлено. Вы можете проверить его, обновив контактную страницу с помощью F5.
Поэтому, когда вы нажимаете F5, значение срока действия кеширования ответа не играет никакой роли, чтобы служить для контента. Вы должны увидеть ответ 200 для запроса на контакт.

Литература:
[1]. ASP.NET Core Response Caching Sample (using middleware)
[2]. ResponseCache attribute sample
[3]: How to control web page caching, across all browsers?

+0

Метод действия индекса возвращает View, так что вы говорите, может быть правдой (я еще не пробовал). Однако мой вопрос был связан с методом действий, который возвращает данные в формате JSON. Как и тот, который я написал в вопросе. – LP13

+0

Content-Type не имеет значения, используете ли вы браузер, и вы находитесь в указанных ситуациях, когда получаете кешированный ответ. Что касается Postman, если вы установили его как автономное приложение (загрузив его со своего сайта), у вас не будет возможности кэширования ваших запросов. Но если вы установите его в качестве приложения в Google Chrome, вам удастся получить кешированные ответы. Я добавлю необходимую информацию в ответ. – Michael