ASP.NET Core 2.0 - промежуточное программное обеспечение для кэширования ответов Http - ничего не кэшируется
Я создал новое решение из шаблона WebApi .Net Core 2.0 в Visual Studio. Я добавил следующее при запуске.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddHttpCacheHeaders(opt => opt.MaxAge = 600);
services.AddResponseCaching();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseResponseCaching();
app.UseHttpCacheHeaders();
app.UseMvc();
}
Затем, с почтальоном, я ударил http://localhost:xxxx/api/values
которая является конечной точкой, созданной шаблоном, и которая возвращает ["value1","value2"]
Обратите внимание, что я убедился, что Postman не отправляет заголовок без кэширования (в настройках Postman).
HttCacheHeaders
сервис приходит из этого репо. Добавляет заголовки кеша HTTP. Так что мой заголовок ответа конечной точки:
- Cache-Control: общедоступный,max-age=600
- Тип контента: приложение / JSON; кодировка = UTF-8
- Дата: пт, 29 сен 2017 14:02:29 GMT
- ETag: C5DFA8974BB722D27E71EE50D3D14625
- Истекает: Пт, 29 сентября 2017 14:03:29 GMT
- Дата последнего изменения: пт, 29 сен 2017 14:02:29 GMT
- Сервер: Кестрел
- Передача-кодировка: чанки
- Варьируются: Принять, Принять-Язык, Принять-Кодировать
- X-Powered-By: ASP.NET
- X-SourceFiles: =? UTF-8? B?................
Проблема в том, что ничего не кэшируется. Ouput
только окна показывает The response could not be cached for this request.
Так что я немного растерялся, как использовать ASP.NET Core ResponseCaching Middleware
,
Обновить
Если я не использую HttCacheHeaders
обслуживание, но добавить [ResponseCache(Duration = 600)]
к действию моего контроллера, кеш работает.
Обратите внимание, что причина, которую я хочу использовать HttCacheHeaders
для ETag
а также Last-Modified
позже сделать Кэширование Валидации так же как Кэширование Истечения.
2 ответа
Это своего рода не ответ, с некоторыми советами по устранению неполадок.
Я попробовал ваш точный код, и он работал нормально для меня. Может быть, ошибка была исправлена в репозитории HttpCacheHeaders или ResponseCaching?
К сожалению, отладка ResponseCaching на стороне сервера является сложной задачей, поскольку в ней есть странные правила и нет адекватной регистрации. Когда в прошлом у меня были подобные проблемы, мне приходилось извлекать исходный код Microsoft, чтобы пройти через него и найти проблему с моим кодом.
Заметка, которую вы нашли в окне вывода "Не удалось кэшировать ответ на этот запрос", является подсказкой.
Кэширование запроса на стороне сервера состоит из двух частей. Сервер должен заполнить кеш при первом запросе URL. Он будет обслуживать кэшированную версию во второй раз, когда он запрашивается. Обратите внимание, когда появляется сообщение об ошибке, если оно находится на первом или втором запросе. Это скажет вам, если он не может быть сохранен в кеше или не может быть извлечен из кеша.
Правила для хранения и извлечения находятся в этом файле исходного кода: https://github.com/aspnet/ResponseCaching/blob/3bf5f6a1ce69b65c998d6f5c739822a9bed4a67e/src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCachingPolicyProvider.cs
Ваш заголовок "Cache-Control:public,max-age=600" должен точно соответствовать этим правилам.
Вы уже нашли no-cache/no-store "gotcha". Есть также несколько других с ResponseCaching, на которые стоит обратить внимание:
Аутентифицированные запросы и ответы с set-cookie не будут кэшироваться. Будут кэшироваться только запросы, использующие метод GET или HEAD. Если QueryString отличается, он создаст новую запись в кэше. Кроме того, обычно требуется, чтобы заголовок "Vary" предотвращал кэширование, если определенные условия запроса отличаются от ранее кэшированного запроса (например, пользовательский агент, accept-encoding и т. Д.).
Следует отметить, что использование заголовков запросов no-cache / no-store было, вероятно, плохим выбором при проектировании, так как ResponseCache ядра ASP.Net Core, скорее всего, будет использоваться сервером, который владеет ответом, а не промежуточным кэшем, таким как CDN/. ISP. Я расширил базовый ResponseCache с возможностью отключить почитание этих заголовков (а также сериализовать кеш на диск, а не только в памяти). Это простая замена для кэша по умолчанию.
Вы можете найти мое расширение здесь: https://github.com/speige/AspNetCore.ResponseCaching.Extensions https://www.nuget.org/packages/AspNetCore.ResponseCaching.Extensions
HttpCacheHeader
это не кеш магазин.
Это промежуточное программное обеспечение обрабатывает часть "backend": оно генерирует правильные заголовки, связанные с кэшем, и гарантирует, что кэш может проверять истечение срока действия (304 Not Modified) и предварительные условия (412 Precondition Failed) (часто используется для проверок параллелизма).