2012-10-11 6 views
5

Ho un metodo di azione GET MVC4 che restituisce un FileStreamResult. Un requisito esiste per utilizzare solo SSL e di non consentire la memorizzazione nella cache del documento servito così ssl si è e ho anche usato il filtro OutputCache con le seguenti proprietà:E 'possibile rimuovere un'intestazione di risposta pragma no-cache una volta che è stata impostata dal metodo SetCacheability?

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None", Location = OutputCacheLocation.None)] 

Questo si comporta come previsto e produce la seguente risposta intestazioni:

Cache-Control: no-cache, no-store 
Expires: -1 
Pragma: no-cache 

Tutto andava bene fino a quando ha chiesto di sostenere anche IE8 e, come molti qui hanno anche incontrato i documenti semplicemente non scaricare sia con no-cache set e SSL nel mix. Il wordaround di IE8 e di seguito consiste nell'aggiungere alcune impostazioni del registro che non sono realmente valide o rimuovere le intestazioni no-cache che interrompono un requisito fondamentale.

Ho sperimentato con Fiddler e IE8 e sono riuscito a scaricare un documento se ho appena rimosso il pragma: l'intestazione no-cache ma ho lasciato il Cache-Control intatto. Questo non sembrava lasciare una copia del documento nei miei file temporanei di Internet, ma potrei aver bisogno di testarlo ancora.

Con queste informazioni in mente ho pensato che potrebbe essere un compito semplice rimuovere il pragma usando un filtro sull'azione ma sembra non importa quello che faccio io non posso cambiare tutto ciò che OutputCache sta per impostare. Ho anche rimosso l'attributo OutputCache e usato:

Response.Cache.SetCacheability(HttpCacheability.NoCache) 

Utilizzando questo metodo da solo garantisce ricevo le stesse impostazioni della cache di prima, ma non sono fissati a punto di questo metodo chiamata. Questo semplicemente imposta la politica della cache che viene applicata ad un certo punto nella pipeline di risposta ma non so dove.

Qualcuno sa se c'è un modo di aggancio nella pipeline di risposta per modificare le intestazioni della cache mentre vengono scritte?

EDIT Ho una semplice personalizzato IHttpModule nella pipeline che cerca e rimuove qualsiasi intestazione Pragma nel NameValueCollection risposta e mentre la cache-control è impostato il pragma non c'è. Ciò significa che IIS 7.5 sta inserendo il pragma stesso in base a ciò che vede nel controllo della cache, forse? So per certo che non ho impostato nulla oltre le impostazioni predefinite per un semplice sito web.

EDIT controllato il valore di intestazione Cache-Control all'interno del modulo ed è impostato in modo privato le intestazioni di cache non sono state applicate alla risposta ancora. Quindi sembrerebbe che le intestazioni della cache vengano aggiunte dopo l'esecuzione dei moduli, forse?

+0

FWIW, si potrebbe desiderare di leggere questo: http://blogs.msdn.com/b/ieinternals/archive/2009/10/03/internet-explorer-cannot-download-over-https-when-no- cache.aspx. Anche con le intestazioni No-Cache impostate, la risposta continuerà comunque a finire in un file temporaneo su disco; idealmente verrà ripulito a breve, ma non è garantito. – EricLaw

+0

Grazie EricLaw. Ho trovato questo articolo nelle mie ricerche che mi ha spinto a usare il violinista per modificare le intestazioni di risposta prima che il browser riceva il flusso. Questo è il momento in cui ho notato che semplicemente non includendo il pragma ma lasciando intatto il controllo della cache, il file veniva scaricato ma non riuscivo a vederlo nella cartella Temp Internet Files. Continuo a pensare che sia necessario ripeterlo un po 'per essere sicuro che non sia memorizzato nella cache da qualche parte. – Mark

+0

Ho un [problema simile] (http://stackoverflow.com/questions/13119340/ie6-8-unable-to-download-file-from-https-site) e non poteva trovare un modo per fare 'Risposta Lavoro .Cache.SetCacheability' - aggiunge sempre l'intestazione 'Pragma' e mette sempre' no-cache' prima di 'no-store'. Questo dovrebbe essere controllabile, a meno che non si abbia a che fare con IE3/Netscape Navigator, quindi l'invio dell'intestazione 'Pragma' è piuttosto inutile. – Keith

risposta

0

Stavo risolvendo questo stesso problema e mi sono imbattuto nello stesso problema rimuovendo l'intestazione pragma. Quando .NET esegue il rendering di un oggetto Page, genera le intestazioni della cache. La gestione della cache è controllata da un HttpModule. Ho provato diversi modi per rimuovere l'intestazione pragma, ma senza successo.

Un metodo che non ho ancora provato sembra funzionare, ma sembra anche un PITA per implementare un filtro sul flusso di output Response tramite Response.Filter = new MyCustomFilter(...).

Prima di questo ho provato a controllare le intestazioni in varie posizioni, ma l'elaborazione della cache di output non era stata ancora eseguita e l'intestazione pragma non esisteva e quindi non poteva essere rimossa. In particolare, l'evento HttpApplication PreSendRequestHeaders non ha funzionato.

Alcune altre opzioni includono l'implementazione del proprio modulo OutputCache invece di utilizzare la versione del framework incorporato, o in qualche modo sovrascrivere la classe System.Web.HttpCachePolicy in cui viene visualizzata l'intestazione pragma.

L'intestazione Pragma è resa come parte dell'opzione HttpCacheability.NoCache:

if (httpCacheability == HttpCacheability.NoCache || httpCacheability == HttpCacheability.Server) 
    { 
    if (HttpCachePolicy.s_headerPragmaNoCache == null) 
     HttpCachePolicy.s_headerPragmaNoCache = new HttpResponseHeader(4, "no-cache"); 
    this._headerPragma = HttpCachePolicy.s_headerPragmaNoCache; 
    if (this._allowInHistory != 1) 
    { 
     if (HttpCachePolicy.s_headerExpiresMinus1 == null) 
     HttpCachePolicy.s_headerExpiresMinus1 = new HttpResponseHeader(18, "-1"); 
     this._headerExpires = HttpCachePolicy.s_headerExpiresMinus1; 
    } 
    } 

L'unica opzione pragmatica che ho trovato è quello di impostare la cache-control a privati ​​e anche impostare un breve scadenza per la URL. Non affronta la causa principale su entrambe le estremità, ma finisce con quasi lo stesso effetto desiderato.

Problemi correlati