2010-02-03 4 views
2

J'ai du code qui est utilisé pour remplacer certaines sorties de page par d'autres textes. La façon dont j'accomplis cela est en définissant le Response.Filter à un flux, vidant la réponse, puis relisant ce flux dans une chaîne. De là, je peux manipuler la chaîne et sortir le code résultant. Vous pouvez voir le code de base pour cela à Render a view as a string.Response.Flush brise la mise en cache des pages

Cependant, j'ai remarqué que Page Caching ne fonctionne plus après le premier appel Response.Flush.

J'ai mis en place une simple ASP.NET WebApp à titre d'exemple. J'ai un Default.aspx avec un ensemble @OutputCache pendant 30 secondes. Tout cela est la sortie DateTime.Now.ToLongTimeString(). Je remplace Render. Si je fais un Response.Flush (même après le base.Render) la page n'est pas mise en cache. Ceci est indépendant de toute mise en cache programmatique que j'ai définie.

Il semble donc que Response.Flush mine complètement toute mise en cache de page en cours d'utilisation. Pourquoi est-ce?

crédit supplémentaire: existe-t-il un moyen d'accomplir ce que je veux (rendre la sortie à une chaîne de caractères) qui n'aboutira pas à ce que Cache de page soit contourné?

ASPX Page:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestCacheVsFlush._Default" %> 
<%@ OutputCache Duration="30" VaryByParam="none" %> 
<%= DateTime.Now.ToLongTimeString() %> 

code-behind (Page sont mises en cache):

protected override void Render(HtmlTextWriter writer) 
    { 
     base.Render(writer); 
    } 

code-behind (Page est pas mises en cache):

protected override void Render(HtmlTextWriter writer) 
{ 
    base.Render(writer); 
    Response.Flush(); 
} 

code-behind (Page est toujours pas mis en mémoire cache):

protected override void Render(HtmlTextWriter writer) 
{ 
    base.Render(writer); 
    Response.Cache.SetCacheability(HttpCacheability.Server); 
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(30)); 
    Response.Flush(); 
} 
+0

modifier: J'ai mis à jour le titre pour être plus descriptif du problème – hackerhasid

+0

Ceci est une bonne question. Creuser à travers le réflecteur, je ne trouve pas de connexions évidentes à la chasse et la mise en cache .... J'aimerais pouvoir passer plus de temps là-dessus maintenant. – womp

Répondre

3

D'accord, je pense avoir une réponse partielle pour vous.

De here:

module de mémoire cache de sortie remplit la IHttpCachePolicy intrinsèque dans stade BeginRequest si un profil correspondant est trouvé. Les autres modules peuvent modifier encore la politique de cache pour la demande actuelle qui pourrait changer comportement en mode utilisateur ou en mode noyau . Le cache de sortie met en cache 200 réponses aux demandes GET uniquement. Si certains modules déjà rincée la réponse par la demande de temps atteint stade UpdateRequestCache ou si les en-têtes sont supprimés, la réponse est pas mis en cache dans le module de cache de sortie.

Cet article est spécifique à IIS7, donc je ne sais pas comment cela se traduit dans les autres versions, mais c'est probablement similaire. UpdateRequestCache est l'un des HttpApplication pipeline events, et il se produit après qu'un IHttpHandler (par exemple votre objet Page) a fini de gérer la demande.

Alors ...il ne semble pas bon d'effectuer un vidage à l'intérieur de votre page.

+0

FYI, cela se passe aussi dans IIS6. – hackerhasid

Questions connexes