2015-03-25 2 views
7

Я использую пакет Microsoft.AspNet.StaticFiles и настраиваю его в Startup.cs как app.UseStaticFiles(). Как изменить заголовки поставляемых файлов? Я хочу установить срок действия кеша и т. Д. Для изображений, css и js.Изменение заголовков статических файлов в Asp.net Core

+1

[кэширование статических ресурсов навсегда с помощью ASP.NET Core] (https://www.softfluent.com/blog/dev/2017/01/08/Caching-static-resources-forever-with-ASP-NET-Core) – meziantou

ответ

10

Вы можете использовать StaticFileOptions, который содержит обработчик событий, который вызывается при каждом запросе статического файла.

Ваш Startup.cs должен выглядеть примерно так:

// Add static files to the request pipeline. 
app.UseStaticFiles(new StaticFileOptions() 
{ 
    OnPrepareResponse = (context) => 
    { 
     // Disable caching of all static files. 
     context.Context.Response.Headers["Cache-Control"] = "no-cache, no-store"; 
     context.Context.Response.Headers["Pragma"] = "no-cache"; 
     context.Context.Response.Headers["Expires"] = "-1"; 
    } 
}); 

Вы можете, конечно, изменить приведенный выше код для проверки типа содержимого и только изменять заголовки для JS или CSS или что вы хотите.

2

Вы должны написать промежуточное программное обеспечение, чтобы сделать это, у меня есть образец, который удалить заголовки на моем GitHub https://github.com/aguacongas/chatle
Посмотрите на проект ChatLe.HttpUtility, это немного сложнее. Вы можете посмотреть на этот вопрос, а также:

How to do remove some httpresponse headers on each response like Server and ETag?

Однако это не будет работать под IIS, потому что IIS управлять сама статика файлы. Он будет работать только на автономном приложении, например kestrel или firefly

+0

Вы имеете в виду, что все три из них не будут работать под IIS? Или один из ответов, в частности? –

1

В IIS вы можете добавить файл web.config в свою папку wwwroot с конфигурациями заголовков. Пример, который будет контролировать заголовки кэша для всех файлов:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 

    <!-- Disable caching --> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Cache-Control" value="no-cache" /> 
     </customHeaders> 
    </httpProtocol> 

    </system.webServer> 
</configuration> 
+0

Это не сработает, если на веб-сайтах будут размещены модули .NET Core (например, в случае OP), так как .NET Core не соблюдает 'web.config'. Как работает .NET Core, в основном работает собственный веб-сервер Kestrel, который скрывается за IIS + HTTP-модулем (он же ANCM, как и основной модуль ASP.NET). https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/aspnet-core-module –

1

Если вы ищете решение, что позволяет настроить различные модели поведения для каждой среды (разработка, производство более &), который также является пунктом наличия этих параметров в файле web.config вместо Аппаратно кодируя весь материал, вы могли бы рассмотреть следующий подход.

Добавьте следующий раздел ключ/значение в appsettings.json файла:

"StaticFiles": { 
    "Headers": { 
     "Cache-Control": "no-cache, no-store", 
     "Pragma": "no-cache", 
     "Expires": "-1" 
    } 
    } 

Затем добавить следующее в Configure методе Startup.cs файла соответственно:

app.UseStaticFiles(new StaticFileOptions() 
{ 
    OnPrepareResponse = (context) => 
    { 
     // Disable caching for all static files. 
     context.Context.Response.Headers["Cache-Control"] = Configuration["StaticFiles:Headers:Cache-Control"]; 
     context.Context.Response.Headers["Pragma"] = Configuration["StaticFiles:Headers:Pragma"]; 
     context.Context.Response.Headers["Expires"] = Configuration["StaticFiles:Headers:Expires"]; 
    } 
}); 

Это позволит разработчику определять различные настройки кеша с использованием разных/нескольких/каскадных файлов настроек (appsettings.json, appsettings.production.json и т. Д.) - это то, что можно было бы сделать со старым шаблоном конфигурации web.config - с новым ядром ASP.NET Core.

Дополнительную информацию по теме Я также предлагаю прочитать this post и/или эти замечательные статьи из официального ASP.NET Основные документы:

0

На основании ответа Джоша слоняться по выше, добавил код, чтобы определить, если это PDF-файл

Startup.cs:

 app.UseStaticFiles(new StaticFileOptions 
     { 
     OnPrepareResponse = ctx => 
      { 
      if(ctx.File.Name.ToLower().EndsWith(".pdf")) 
      { 
       ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=86400"); 
      } 
      else 
      { 
       ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=31104000"); 
      } 
      } 
     }); 
Смежные вопросы