ServiceStack 4: невозможно добавить заголовок Expires для статического содержимого
В моем файле web.config я пытаюсь добавить кеширование для статического содержимого:
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseExpires" httpExpires="Sun, 1 Jan 2020 00:00:00 UTC" />
</staticContent>
<modules runAllManagedModulesForAllRequests="true" />
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<add path="*" name="ServiceStack.Factory" type="ServiceStack.HttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" />
</handlers>
</system.webServer>
Однако когда я запускаю YSlow! Я все еще получаю оценку F за "Добавить заголовок Expires"; таким образом, создается впечатление, что статический контент, такой как изображения, файлы CSS и Javascript, не кэшируется.
Как я могу сделать это в ServiceStack, так как сделанные мной изменения web.config не попадают в ServiceStack; это работает в ASP.NET MVC, но как мне сервер статического контента с истекает заголовки?
Я также попробовал это, но мои статические файлы все еще не кэшируются.
<system.webServer>
<staticContent>
<clientCache cacheControlMaxAge="30.00:00:00" cacheControlMode="UseMaxAge"/>
</staticContent>
</system.webServer>
1 ответ
Обратите внимание
<staticContent>
Конфигурация xml не влияет на веб-фреймворки, которые предоставляют свои собственные функции обработки статических файлов, такие как ServiceStack.
Статические файлы в ServiceStack обрабатываются StaticFileHandler, который автоматически добавляет заголовки HTTP, полезные для кэширования статических файлов, таких как Last-Modified
заголовок, который используется для отправки пустого 304 Not Modified
Ответ, когда запросы поступают к статическим файлам, которые не изменились с момента их последнего запроса.
Добавление Max-Age в статические файлы
Кроме того, есть возможность указать Cache-Control: max-age={Seconds}
для определенных типов файлов, которые по умолчанию включают максимальный возраст для типов содержимого изображения, например:
SetConfig(new HostConfig {
AddMaxAgeForStaticMimeTypes = {
{ "image/gif", TimeSpan.FromHours(1) },
{ "image/png", TimeSpan.FromHours(1) },
{ "image/jpeg", TimeSpan.FromHours(1) },
}
});
Вы также можете изменить и расширить вышеуказанные значения по умолчанию с помощью дополнительных типов контента.
Добавление пользовательских статических заголовков файлов
Новое в v4.0.33+ это StaticFileHandler.ResponseFilter
который вы можете использовать для добавления ваших собственных пользовательских заголовков к статическим файлам, например, это добавляет пользовательский HTTP Expires
заголовок для .txt
файлы, срок действия которых истекает через 1 час:
StaticFileHandler.ResponseFilter = (req, res, file) => {
if (file.Extension == "txt")
res.AddHeader("Expires", DateTime.UtcNow.AddHours(1).ToString("r"));
};
Это изменение теперь доступно на MyGet.