Domanda

Sono alcuni strani comportamenti per quanto riguarda la cache di output in un'applicazione ASP.NET 4 su IIS 7.5. Sono stato in grado di ripetere il problema semplicemente su altre configurazioni vuote, sono certo che questo è un bug, ma non siete sicuri come segnalare a Microsoft.

Un sito in IIS risponde a più di 1 dominio, l'applicazione .NET examins il nome dell'host, e produce contenuti di conseguenza. Ad esempio, può stampare il nome del URL di richiesta in una pagina vuota. Ad esempio, www.first-domain.com, e www.second-domain.com

Il web.config ha la cache appropriata, urlCompression e httpCompression tutti spenti nel nodo system.webServer.

La pagina aspx imposta l'intestazione Cache-Control per pubblico, sia con una data futura per la scadenza, o un valore max-age.

Visita www.first-domain.com uscite la pagina che scrive con successo 'www.first-domain.com'.

Tuttavia, visitando www.second-domain.com uscite una pagina che scrive 'www.first-domain.com'.

Esaminando i-request-tracce falliti, System.Web.Caching.OutputCacheModule ha trovato l'uscita cache (anche se i file .config hanno trasformato la funzione off), la cache ha abbinato anche se il nome host richiesta URL sono diversi, e quindi la seconda richiesta di uscita volontà i risultati della prima richiesta al dominio diverso per tutto il tempo il max-age / scadenza è stata fissata per, prima che la pagina corretta per il secondo dominio apparirà.

In ogni impostazione Cache-Control a privati, o la rimozione del modulo 'OutputCache' nei risolve web.config il problema, pur mantenendo le intestazioni Cache-Control corretti inviati al browser, ma ovviamente, non posso trarre vantaggio kernel della cache quando ne ho bisogno.

Non riesco a trovare alcuna documentazione MSDN su come l'OutputCacheModule è configurato.

Qualcuno ha altrimenti sperimentato questo problema, come posso andare sull'abilitazione kernel caching e lasciare che tiene conto URL host (senza separare l'applicazione a diversi siti in IIS).

Grazie.

Aggiornamento:

Aggiunta SetSlidingExpiration ha alcun effetto, come cache kernal memorizza ancora l'uscita indipendentemente dalla richiesta host. L'unico scenario è ora quello di disabilitare la cache di output, o eseguire un'istanza duplicato della app su ogni dominio verrà eseguito - in considerazione del calo di prestazioni del server questo comporterebbe contro l'aumento delle prestazioni acquisite nell'utilizzo cache di output, abbiamo deciso per disabilitare la cache di output per questa applicazione.

È stato utile?

Soluzione

Non risponde è stata fornita dopo 9 mesi, e nessuna soluzione è stata trovata, solo una soluzione, forse questo sarà risolto nella prossima versione di IIS superiore a 7,5 ...

-

Aggiunta SetSlidingExpiration ha alcun effetto, come cache kernal memorizza ancora l'uscita indipendentemente dalla richiesta host. L'unico scenario è ora quello di disabilitare la cache di output, o eseguire un'istanza duplicato della app su ogni dominio verrà eseguito - in considerazione del calo di prestazioni del server questo comporterebbe contro l'aumento delle prestazioni acquisite nell'utilizzo cache di output, abbiamo deciso per disabilitare la cache di output per questa applicazione.

Altri suggerimenti

ho avuto un problema molto simile e nessuna soluzione qui mi ha aiutato.

TLDR :. Rimuovere con forza il modulo di OutputCache sul Web.config è stata l'unica soluzione che ho trovato

Il mio scenario è stato un po 'diverso.

Ho CORS istituito nel Application_BeginRequest, rispondendo Access-Control-Allow-Origin per host specifici che mi chiamano (impostandolo a * non è stata affidabile).

Il mio controller imposta anche Cache-control: public per le sue risposte.

Quello che ho trovato

Ogni volta che ho impostato Cache-control: public, IIS memorizza nella cache con forza la risposta. I punti di interruzione su entrambi Application_BeginRequest o il mio controller non sono mai stati colpiti una seconda volta.

La disabilitazione di uscita e la memorizzazione nella cache del kernel tramite Gestione IIS come visto sotto mi avrebbe colpire i punti di interruzione Application_BeginRequest, ma non mi ha mai preso l'Controller. Qualcosa stava ancora caching risposte. uscita la cache disabilitata e la cache del kernel su inetmgr

questo articolo ha suggerito di rimuovere il modulo OutputCache da IIS aiuterebbe.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="OutputCache" />
  </modules>
</system.webServer>

Così facendo mi ha permesso di colpire il mio controller, finalmente.

Cosa aiuterebbe ancora di più

Se qualcuno da MS o non poteva brillare una luce se c'è un modo per cambiare questo comportamento. OutputCache potrebbe essere utile in alcune parti di un'applicazione e inutile in altri.

Attenzione

Forse sono (siamo?) Per risolvere il problema sbagliato.

Forse IIS stava prendendo il sopravvento la memorizzazione nella cache in questo scenario perché dovrebbe. Forse proxy lungo il percorso tra il mio server e l'utente si comportano proprio come quella in questo scenario esatto, e se questo è il caso, allora il conflitto a questo su IIS è sbagliato. Dovrò capirlo e forse si dovrebbe troppo.

Non ho problema simile. Io uso URL personalizzato masterizzatore. Ho pagine example.com/articles e example.com/art-ANY_ID.html. Entrambi mappa url articles.aspx (nel secondo esempio come articles.aspx? Id = ANY_ID). Ha funzionato bene con ASP.NET 2.0 e la modalità pipeline di Classic. Dopo che c'è cambiato ad ASP.NET 4 e modalità integrata, abbiamo ottenuto un comportamento strano: entrambi di ritorno in modo identico uscita url. Era qualsiasi pagina, come example.com/art-ANY_ID.html.

Ora abbiamo rimosso <add extension=".html" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" /> dalla sezione <caching enabled="true" enableKernelCache="true"> e funziona benissimo. Non capisco perché http.sys cache di esso.

Avete trovato alcuna spiegazione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top