Кэширование ответов в ASP.NET CoreResponse caching in ASP.NET Core

Джон Луо, Рик Андерсон (и Виктор СмитBy John Luo, Rick Anderson, and Steve Smith

Просмотреть или скачать образец кода (как скачивать)View or download sample code (how to download)

Кэширование ответов сокращает количество запросов к веб-серверу, которые клиент или прокси выполняет.Response caching reduces the number of requests a client or proxy makes to a web server. Кэширование ответов также сокращает объем работы, выполняемой веб-сервером для создания ответа.Response caching also reduces the amount of work the web server performs to generate a response. Кэширование ответов управляется заголовками, которые определяют, как клиент, прокси-сервер и промежуточное по должны кэшировать ответы.Response caching is controlled by headers that specify how you want client, proxy, and middleware to cache responses.

Атрибут респонсекаче участвует в установках заголовков кэширования ответа.The ResponseCache attribute participates in setting response caching headers. Клиенты и промежуточные прокси-серверы должны учитывать заголовки для кэширования ответов в спецификации кэширования HTTP 1,1.Clients and intermediate proxies should honor the headers for caching responses under the HTTP 1.1 Caching specification.

Для кэширования на стороне сервера, которое следует за спецификацией кэширования HTTP 1,1, используйте по промежуточного слоя кэширование ответа.For server-side caching that follows the HTTP 1.1 Caching specification, use Response Caching Middleware. По промежуточного слоя может использовать ResponseCacheAttribute свойства, чтобы повлиять на поведение кэширования на стороне сервера.The middleware can use the ResponseCacheAttribute properties to influence server-side caching behavior.

Кэширование ответов на основе HTTPHTTP-based response caching

Спецификация кэширования HTTP 1,1 описывает, как должны вести себя Интернет-кэши.The HTTP 1.1 Caching specification describes how Internet caches should behave. Основной заголовок HTTP, используемый для кэширования, — это Cache-Control, который используется для указания директивкэша.The primary HTTP header used for caching is Cache-Control, which is used to specify cache directives. Директивы управляют поведением кэширования в качестве запросов от клиентов к серверам, а также по мере того, как отклики от серверов возвращаются к клиентам.The directives control caching behavior as requests make their way from clients to servers and as responses make their way from servers back to clients. Запросы и ответы перемещаются через прокси-серверы, а прокси-серверы также должны соответствовать спецификации кэширования HTTP 1,1.Requests and responses move through proxy servers, and proxy servers must also conform to the HTTP 1.1 Caching specification.

Общие Cache-Control директивы показаны в следующей таблице.Common Cache-Control directives are shown in the following table.

| ДирективаDirective | ДействиеAction | | --- название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • ИД пользователя "SignalR":'SignalR' uid:

-------------------------------- | Заголовок---: Автор: описание: Моникерранже: MS. author: MS. Дата: No-Loc:-------------------------------- | --- title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • ИД пользователя "SignalR":'SignalR' uid:

--- | | общедоступная | Ответ может храниться в кэше.--- | | public | A cache may store the response. | | частный | Ответ не должен храниться в общем кэше.| | private | The response must not be stored by a shared cache. Частный кэш может хранить и повторно использовать ответ.A private cache may store and reuse the response. | | max-age | Клиент не принимает ответ, возраст которого превышает указанное число секунд.| | max-age | The client doesn't accept a response whose age is greater than the specified number of seconds. Примеры: max-age=60 (60 секунд), max-age=2592000 (1 месяц) | | без кэша | В запросах: кэш не должен использовать сохраненный ответ для удовлетворения запроса.Examples: max-age=60 (60 seconds), max-age=2592000 (1 month) | | no-cache | On requests: A cache must not use a stored response to satisfy the request. Сервер источника повторно создает ответ для клиента, и по промежуточного слоя обновляет сохраненный ответ в своем кэше.The origin server regenerates the response for the client, and the middleware updates the stored response in its cache.

В ответах: ответ не должен использоваться для последующего запроса без проверки на сервере-источнике.On responses: The response must not be used for a subsequent request without validation on the origin server. | | без магазина | В запросах: кэш не должен сохранять запрос.| | no-store | On requests: A cache must not store the request.

Вответах: кэш не должен хранить какую-либо часть ответа.On responses: A cache must not store any part of the response. |

Другие заголовки кэша, которые играют роль в кэшировании, показаны в следующей таблице.Other cache headers that play a role in caching are shown in the following table.

| ЗаголовокHeader | ФункцияFunction | | --- название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • ИД пользователя "SignalR":'SignalR' uid:

----------------------------- | Заголовок---: Автор: описание: Моникерранже: MS. author: MS. Дата: No-Loc:----------------------------- | --- title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • ИД пользователя "SignalR":'SignalR' uid:

---- | | Возраст | Оценка количества времени в секундах с момента создания или успешной проверки ответа на сервере источника.---- | | Age | An estimate of the amount of time in seconds since the response was generated or successfully validated at the origin server. | | Срок действия истекает | Время, после которого ответ считается устаревшим.| | Expires | The time after which the response is considered stale. | | Pragma | Существует для обеспечения обратной совместимости с кэшами HTTP/1.0 для настройки no-cache поведения.| | Pragma | Exists for backwards compatibility with HTTP/1.0 caches for setting no-cache behavior. Если Cache-Control заголовок имеется, Pragma заголовок игнорируется.If the Cache-Control header is present, the Pragma header is ignored. | | Vary | Указывает, что кэшированный ответ не должен отправляться, если все Vary поля заголовка не совпадают как в исходном запросе, так и в новом запросе кэшированного ответа.| | Vary | Specifies that a cached response must not be sent unless all of the Vary header fields match in both the cached response's original request and the new request. |

Директивы управления кэшем запросов для кэширования на основе HTTPHTTP-based caching respects request Cache-Control directives

Спецификация кэширования HTTP 1,1 для заголовка Cache-Control требует, чтобы кэш учитывал допустимый Cache-Control заголовок, отправленный клиентом.The HTTP 1.1 Caching specification for the Cache-Control header requires a cache to honor a valid Cache-Control header sent by the client. Клиент может выполнять запросы со no-cache значением заголовка и принудительно выдавать серверу запрос на создание нового ответа для каждого запроса.A client can make requests with a no-cache header value and force the server to generate a new response for every request.

Всегда учитывать Cache-Control заголовки запросов клиентов имеет смысл, если рассматривать цель кэширования HTTP.Always honoring client Cache-Control request headers makes sense if you consider the goal of HTTP caching. В официальной спецификации кэширование предназначено для уменьшения задержки и нагрузки на сети для удовлетворения запросов в сети клиентов, прокси и серверов.Under the official specification, caching is meant to reduce the latency and network overhead of satisfying requests across a network of clients, proxies, and servers. Это не обязательно способ управления нагрузкой на сервере-источнике.It isn't necessarily a way to control the load on an origin server.

При использовании по промежуточного слоя для кэширования ответа разработчик не управляет этим поведением кэширования, поскольку по промежуточного слоя соответствует официальной спецификации кэширования.There's no developer control over this caching behavior when using the Response Caching Middleware because the middleware adheres to the official caching specification. Запланированные улучшения по промежуточного слоя позволяют настроить по промежуточного слоя на игнорирование заголовка запроса Cache-Control при принятии решения о выполнении кэшированного ответа.Planned enhancements to the middleware are an opportunity to configure the middleware to ignore a request's Cache-Control header when deciding to serve a cached response. Запланированные улучшения дают возможность лучше управлять нагрузкой сервера.Planned enhancements provide an opportunity to better control server load.

Другая технология кэширования в ASP.NET CoreOther caching technology in ASP.NET Core

Кэширование в памятиIn-memory caching

В процессе кэширования в памяти используется память сервера для хранения кэшированных данных.In-memory caching uses server memory to store cached data. Этот тип кэширования подходит для одного сервера или нескольких серверов, использующих закрепленные сеансы.This type of caching is suitable for a single server or multiple servers using sticky sessions. Прикрепленные сеансы означает, что запросы от клиента всегда направляются на один и тот же сервер для обработки.Sticky sessions means that the requests from a client are always routed to the same server for processing.

Для получения дополнительной информации см. Кэширование в памяти в ASP.NET Core.For more information, see Кэширование в памяти в ASP.NET Core.

Распределенный кэшDistributed Cache

Используйте распределенный кэш для хранения данных в памяти, когда приложение размещается в облаке или ферме серверов.Use a distributed cache to store data in memory when the app is hosted in a cloud or server farm. Кэш является общим для серверов, обрабатывающих запросы.The cache is shared across the servers that process requests. Клиент может отправить запрос, который обрабатывается любым сервером в группе, если доступны кэшированные данные для клиента.A client can submit a request that's handled by any server in the group if cached data for the client is available. ASP.NET Core работает с распределенными кэшами SQL Server, Redisи NCache .ASP.NET Core works with SQL Server, Redis, and NCache distributed caches.

Для получения дополнительной информации см. <xref:performance/caching/distributed>.For more information, see <xref:performance/caching/distributed>.

Вспомогательная функция тега кэшаCache Tag Helper

Кэширование содержимого из представления MVC или Razor страницы с вспомогательной функцией тега кэша.Cache the content from an MVC view or Razor Page with the Cache Tag Helper. Вспомогательная функция тега кэша использует кэширование в памяти для хранения данных.The Cache Tag Helper uses in-memory caching to store data.

Для получения дополнительной информации см. Вспомогательная функция тегов кэша в MVC-моделях ASP.NET Core.For more information, see Вспомогательная функция тегов кэша в MVC-моделях ASP.NET Core.

Вспомогательная функция тега распределенного кэшаDistributed Cache Tag Helper

Кэширование содержимого из представления MVC или Razor страницы в сценариях распределенного облака или веб-фермы с помощью вспомогательной функции тега распределенного кэша.Cache the content from an MVC view or Razor Page in distributed cloud or web farm scenarios with the Distributed Cache Tag Helper. Вспомогательная функция тега распределенного кэша использует SQL Server, Redisили NCache для хранения данных.The Distributed Cache Tag Helper uses SQL Server, Redis, or NCache to store data.

Для получения дополнительной информации см. Вспомогательная функция тега распределенного кэша в ASP.NET Core.For more information, see Вспомогательная функция тега распределенного кэша в ASP.NET Core.

Атрибут РеспонсекачеResponseCache attribute

ResponseCacheAttributeУказывает параметры, необходимые для настройки соответствующих заголовков в кэшировании ответов.The ResponseCacheAttribute specifies the parameters necessary for setting appropriate headers in response caching.

Предупреждение

Отключите кэширование для содержимого, содержащего сведения для клиентов, прошедших проверку подлинности.Disable caching for content that contains information for authenticated clients. Кэширование следует включать только для содержимого, которое не изменяется в зависимости от удостоверения пользователя или от того, вошел ли пользователь в систему.Caching should only be enabled for content that doesn't change based on a user's identity or whether a user is signed in.

VaryByQueryKeysизменяет сохраненный ответ на значения заданного списка ключей запроса.VaryByQueryKeys varies the stored response by the values of the given list of query keys. Если указано одно значение * , по промежуточного слоя изменяет ответы всеми параметрами строки запроса.When a single value of * is provided, the middleware varies responses by all request query string parameters.

Для установки свойства необходимо включить по промежуточного слоя кэширования ответа VaryByQueryKeys .Response Caching Middleware must be enabled to set the VaryByQueryKeys property. В противном случае выдается исключение времени выполнения.Otherwise, a runtime exception is thrown. Отсутствует соответствующий заголовок HTTP для VaryByQueryKeys Свойства.There isn't a corresponding HTTP header for the VaryByQueryKeys property. Свойство является компонентом HTTP, обрабатываемым по промежуточного слоя кэширования ответа.The property is an HTTP feature handled by Response Caching Middleware. Чтобы по промежуточного слоя обслуживать кэшированный ответ, строка запроса и значение строки запроса должны соответствовать предыдущему запросу.For the middleware to serve a cached response, the query string and query string value must match a previous request. Например, рассмотрим последовательность запросов и результатов, показанных в следующей таблице.For example, consider the sequence of requests and results shown in the following table.

| ЗапросRequest | РезультатResult | | --- название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • ИД пользователя "SignalR":'SignalR' uid:

---------------- | Заголовок---: Автор: описание: Моникерранже: MS. author: MS. Дата: No-Loc:---------------- | --- title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • ИД пользователя "SignalR":'SignalR' uid:

название: автор: описание: monikerRange: ms.author: ms.date: no-loc:title: author: description: monikerRange: ms.author: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • ИД пользователя "SignalR":'SignalR' uid:

------------- | | http://example.com?key1=value1 | Возвращается с сервера.------------- | | http://example.com?key1=value1 | Returned from the server. | | http://example.com?key1=value1 | Возвращается из промежуточного слоя.| | http://example.com?key1=value1 | Returned from middleware. | | http://example.com?key1=value2 | Возвращается с сервера.| | http://example.com?key1=value2 | Returned from the server. |

Первый запрос возвращается сервером и кэшируется по промежуточного слоя.The first request is returned by the server and cached in middleware. Второй запрос возвращается по промежуточного слоя, так как строка запроса совпадает с предыдущим запросом.The second request is returned by middleware because the query string matches the previous request. Третий запрос не находится в кэше по промежуточного слоя, так как значение строки запроса не соответствует предыдущему запросу.The third request isn't in the middleware cache because the query string value doesn't match a previous request.

ResponseCacheAttributeИспользуется для настройки и создания (через IFilterFactory ) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter .The ResponseCacheAttribute is used to configure and create (via IFilterFactory) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter. ResponseCacheFilterКомпонент выполняет работу по обновлению соответствующих HTTP-заголовков и функций ответа.The ResponseCacheFilter performs the work of updating the appropriate HTTP headers and features of the response. Фильтр:The filter:

  • Удаляет все существующие заголовки для Vary , Cache-Control и Pragma .Removes any existing headers for Vary, Cache-Control, and Pragma.
  • Записывает соответствующие заголовки на основе свойств, заданных в ResponseCacheAttribute .Writes out the appropriate headers based on the properties set in the ResponseCacheAttribute.
  • Обновляет компонент кэширования ответов HTTP, если VaryByQueryKeys задано значение.Updates the response caching HTTP feature if VaryByQueryKeys is set.

МеняющиеVary

Этот заголовок записывается только в том случае, если VaryByHeader задано свойство.This header is only written when the VaryByHeader property is set. Свойство, для которого задано Vary значение свойства.The property set to the Vary property's value. В следующем примере используется VaryByHeader свойство:The following sample uses the VaryByHeader property:

[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Cache1Model : PageModel
{

С помощью примера приложения просмотрите заголовки ответа с помощью сетевых средств браузера.Using the sample app, view the response headers with the browser's network tools. Следующие заголовки ответа отправляются с ответом страницы Cache1:The following response headers are sent with the Cache1 page response:

Cache-Control: public,max-age=30
Vary: User-Agent

\ Store и Location. NoneNoStore and Location.None

NoStoreпереопределяет большинство других свойств.NoStore overrides most of the other properties. Если для этого свойства задано значение true , Cache-Control заголовок устанавливается в значение no-store .When this property is set to true, the Cache-Control header is set to no-store. Если Location параметр имеет значение None :If Location is set to None:

  • Cache-Control задан как no-store,no-cache.Cache-Control is set to no-store,no-cache.
  • Pragma задан как no-cache.Pragma is set to no-cache.

Если NoStore параметр имеет значение false Location , а имеет значение, и, то None Cache-Control Pragma для свойства задаются значения no-cache .If NoStore is false and Location is None, Cache-Control, and Pragma are set to no-cache.

NoStoreобычно имеет значение true для страниц ошибок.NoStore is typically set to true for error pages. Страница Cache2 в примере приложения создает заголовки ответа, указывающие клиенту не сохранять ответ.The Cache2 page in the sample app produces response headers that instruct the client not to store the response.

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class Cache2Model : PageModel
{

Пример приложения возвращает страницу Cache2 со следующими заголовками:The sample app returns the Cache2 page with the following headers:

Cache-Control: no-store,no-cache
Pragma: no-cache

Расположение и длительностьLocation and Duration

Чтобы включить кэширование, Duration необходимо задать положительное значение, которое Location должно быть либо Any (по умолчанию), либо Client .To enable caching, Duration must be set to a positive value and Location must be either Any (the default) or Client. Платформа задает Cache-Control для заголовка значение Location, за которым следует max-age ответ.The framework sets the Cache-Control header to the location value followed by the max-age of the response.

Locationпараметры Any и Client транслируются в Cache-Control значения заголовков public и private соответственно.Location's options of Any and Client translate into Cache-Control header values of public and private, respectively. Как указано в разделе "не Store" и "Location. None ", параметр Location None задает для обоих Cache-Control Pragma заголовков и значение no-cache .As noted in the NoStore and Location.None section, setting Location to None sets both Cache-Control and Pragma headers to no-cache.

Location.Any( Cache-Control значение public ) указывает, что клиент или любой промежуточный прокси-сервер может кэшировать значение, включая по промежуточного слоя кэширования ответа.Location.Any (Cache-Control set to public) indicates that the client or any intermediate proxy may cache the value, including Response Caching Middleware.

Location.Client( Cache-Control значение private ) указывает, что только клиент может кэшировать значение.Location.Client (Cache-Control set to private) indicates that only the client may cache the value. Ни один промежуточный кэш не должен кэшировать значение, включая по промежуточного слоя кэширования ответа.No intermediate cache should cache the value, including Response Caching Middleware.

Заголовки управления кэшем просто предоставляют рекомендации клиентам и промежуточным прокси-серверам, когда и как кэшировать ответы.Cache control headers merely provide guidance to clients and intermediary proxies when and how to cache responses. Нет никакой гарантии, что клиенты и прокси-серверы будут учитывать спецификацию кэширования HTTP 1,1.There's no guarantee that clients and proxies will honor the HTTP 1.1 Caching specification. Промежуточное расположение кэширования ответов всегда соответствует правилам кэширования, указанным в спецификации.Response Caching Middleware always follows the caching rules laid out by the specification.

В следующем примере показана модель страницы Cache3 из примера приложения и заголовки, созданные с помощью параметра Duration и значения по умолчанию Location :The following example shows the Cache3 page model from the sample app and the headers produced by setting Duration and leaving the default Location value:

[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public class Cache3Model : PageModel
{

Пример приложения возвращает страницу Cache3 со следующим заголовком:The sample app returns the Cache3 page with the following header:

Cache-Control: public,max-age=10

Профили кэшаCache profiles

Вместо дублирования параметров кэша ответов во многих атрибутах действия контроллера, профили кэша можно настроить в качестве параметров при настройке MVC и Razor страниц в Startup.ConfigureServices .Instead of duplicating response cache settings on many controller action attributes, cache profiles can be configured as options when setting up MVC/Razor Pages in Startup.ConfigureServices. Значения, найденные в указанном профиле кэша, используются по умолчанию ResponseCacheAttribute и переопределяются любыми свойствами, заданными в атрибуте.Values found in a referenced cache profile are used as the defaults by the ResponseCacheAttribute and are overridden by any properties specified on the attribute.

Настройка профиля кэша.Set up a cache profile. В следующем примере показан 30-секундный профиль кэша в примере приложения Startup.ConfigureServices .The following example shows a 30 second cache profile in the sample app's Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.CacheProfiles.Add("Default30",
            new CacheProfile()
            {
                Duration = 30
            });
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Модель страницы Cache4 в примере приложения ссылается на Default30 профиль кэша:The sample app's Cache4 page model references the Default30 cache profile:

[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{

ResponseCacheAttributeМожно применить к:The ResponseCacheAttribute can be applied to:

  • RazorОбработчики страниц (классы): атрибуты не могут применяться к методам обработчика. Page handlers (classes): Attributes can't be applied to handler methods.
  • Контроллеры MVC (классы).MVC controllers (classes).
  • Действия MVC (методы): атрибуты уровня метода переопределяют параметры, указанные в атрибутах уровня класса.MVC actions (methods): Method-level attributes override the settings specified in class-level attributes.

Результирующий заголовок, примененный к ответу страницы Cache4 в Default30 профиле кэша:The resulting header applied to the Cache4 page response by the Default30 cache profile:

Cache-Control: public,max-age=30

Дополнительные ресурсыAdditional resources