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.

Другие вопросы по тегам