2015-03-25 26 views
7

Utilizzo il pacchetto Microsoft.AspNet.StaticFiles e la configurazione in Startup.cs come app.UseStaticFiles(). Come posso cambiare le intestazioni dei file consegnati? Voglio impostare la scadenza della cache ecc. Per immagini, css e js.Modificare le intestazioni dei file statici in Asp.net Core

+1

[Caching delle risorse statiche per sempre con ASP.NET Core] (https://www.softfluent.com/blog/dev/2017/01/08/Caching-static-resources-per sempre-con-ASP-NET-Core) – meziantou

risposta

10

È possibile utilizzare StaticFileOptions, che contiene un gestore di eventi che viene chiamato su ogni richiesta di un file statico.

vostri Startup.cs dovrebbe essere simile a questa:

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

È possibile, ovviamente, modificare il codice qui sopra per verificare il tipo di contenuto e modificare solo le intestazioni per JS o CSS o quello che volete.

2

Devi scrivere un middleware per fare questo, ho un campione che rimuovere le intestazioni sul mio github https://github.com/aguacongas/chatle
un'occhiata al progetto ChatLe.HttpUtility, è un po 'complicato. si può prendere un aspetto di questa domanda così:

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

Tuttavia questo non funzionerà sotto IIS, perché IIS gestire statica file stesso. Si lavorerà solo su applicazione stand-alone come kestrel o firefly

+0

Vuoi dire che tutti e tre di questi non funzioneranno con IIS? O una delle risposte, in particolare? –

1

in IIS, è possibile aggiungere un file web.config nella cartella wwwroot con le configurazioni di intestazione. Un esempio che controlla le intestazioni di cache per tutti i file:

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

Questo non funzionerà se i siti web ospitano moduli .NET Core (come nel caso di OP), poiché .NET Core non onora 'web.config'. Il modo in cui funziona .NET Core è essenzialmente l'esecuzione del proprio server Web chiamato Kestrel, che si nasconde dietro il modulo IIS + HTTP (noto anche come ANCM, ovvero il modulo principale ASP.NET). https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/aspnet-core-module –

1

Se siete alla ricerca di una soluzione che consente di configurare comportamenti diversi per ogni ambiente (sviluppo, produzione & più), che è anche il punto di avere queste impostazioni nel file web.config invece di hard- codificando l'intera roba, potresti considerare il seguente approccio.

Aggiungere la sezione seguente chiave/valore nel appsettings.json di file:

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

quindi aggiungere il seguente nel metodo del file Startup.cs Configure conseguenza:

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

Ciò consentirà allo sviluppatore di definire diverse impostazioni della cache utilizzando diversi/multipli/file di impostazioni a cascata (appsettings.json, appsettings.production.json e così via) - cosa che si potrebbe fare con il vecchio modello di configurazione web.config - con quello nuovo di ASP.NET Core.

Per ulteriori informazioni sull'argomento, suggerisco anche di leggere this post e/o questi fantastici articoli dall'ASP ufficiale.NET documenti fondamentali:

0

in base alla risposta di Josh Mouch sopra, aggiunto codice per determinare se si tratta di un file 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"); 
      } 
      } 
     }); 
Problemi correlati