2015-03-25 10 views
7

Używam pakietu Microsoft.AspNet.StaticFiles i konfiguruję go w Startup.cs jako app.UseStaticFiles(). Jak mogę zmienić nagłówki dostarczonych plików? Chcę ustawić datę ważności cache dla obrazów, css i js.Zmiana nagłówków plików statycznych w Asp.net Core

+1

[Buforowanie zasobów statycznych na zawsze w środowisku ASP.NET Core] (https://www.softfluent.com/blog/dev/2017/01/08/Buforowanie-statyczne-zasoby-na zawsze-z-ASP-NET-Core) – meziantou

Odpowiedz

10

Można użyć StaticFileOptions, który zawiera moduł obsługi zdarzeń, która jest wywoływana na każde żądanie pliku statycznego.

Twoje Startup.cs powinien wyglądać mniej więcej tak:

// 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"; 
    } 
}); 

Można oczywiście zmodyfikować powyższy kod, aby sprawdzić typ zawartości i modyfikować tylko nagłówki JS lub CSS lub cokolwiek chcesz.

2

Trzeba napisać middleware, aby to zrobić, mam próbki, które usuwają nagłówki na moim github https://github.com/aguacongas/chatle
spojrzeć na projekt ChatLe.HttpUtility, to trochę skomplikowane. można spojrzeć na to pytanie, a także:

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

Jednak to nie będzie działać pod IIS, ponieważ IIS zarządzać statyki sama plików. Będzie działać tylko w samodzielnych aplikacjach, takich jak: kestrel lub firefly

+0

Czy masz na myśli, że wszystkie trzy z nich nie będą działały w IIS? Lub jedną z odpowiedzi, konkretnie? –

1

Pod IIS możesz dodać plik web.config do folderu wwwroot z konfiguracjami nagłówka. Przykładem, który będzie kontrolował nagłówki cache dla wszystkich plików:

<?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

To nie zadziała, jeśli strony hostują moduły .NET Core (tak jak w przypadku OP), ponieważ .NET Core nie honoruje 'web.config'. Sposób działania .NET Core polega zasadniczo na uruchomieniu własnego serwera WWW o nazwie Kestrel, który ukrywa się za modułem HTTP IIS + (aka ANCM, czyli modułem podstawowym ASP.NET). https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/aspnet-core-module –

1

Jeśli szukasz rozwiązania umożliwiające skonfigurowanie różnych zachowań dla każdego środowiska (rozwój, produkcja & więcej), który jest także punkt o te ustawienia w pliku web.configzamiast sprzęt komputerowy kodując całość, można rozważyć następujące podejście.

Dodaj następującą sekcję klucz/wartość w appsettings.json pliku:

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

następnie dodaj następującą w Configure metoda Startup.cs pliku, odpowiednio:

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"]; 
    } 
}); 

Umożliwi to programistce zdefiniowanie różnych ustawień pamięci podręcznej przy użyciu różnych/wielu/kaskadowych plików ustawień (appsettings.json, appsettings.production.json itd.) - co można zrobić za pomocą starego wzorca konfiguracyjnego web.config - z nowym środowiskiem ASP.NET Core.

Aby uzyskać dodatkowe informacje dotyczące tematu, proponuję również przeczytać this post i/lub te wspaniałe artykuły z oficjalnej ASP.NET docs główne:

0

podstawie odpowiedzi Josh Mouch za wyżej, dodaje kod, aby określić, czy jest to plik 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"); 
      } 
      } 
     }); 
Powiązane problemy