2010-06-14 4 views
0

Je rencontre des problèmes pour que AppendHeader fonctionne correctement si j'utilise également un filtre d'autorisation. J'utilise un filtre d'action pour mes actions AJAX qui applique Expires, Last-Modified, Cache-Control et Pragma (bien que pendant le test, j'ai essayé de l'inclure dans la méthode d'action elle-même sans changer les résultats).ASP.net AppendHeader ne fonctionne pas dans ASP MVC

Si je n'ai pas de filtre d'autorisation, les en-têtes fonctionnent correctement. Une fois que j'ajoute le filtre, les en-têtes que j'ai essayé d'ajouter sont déshabillés.

Les en-têtes Je veux ajouter

 
Response.AppendHeader("Expires", "Sun, 19 Nov 1978 05:00:00 GMT"); 
Response.AppendHeader("Last-Modified", String.Format("{0:r}", DateTime.Now)); 
Response.AppendHeader("Cache-Control", "no-store, no-cache, must-revalidate"); 
Response.AppendHeader("Cache-Control", "post-check=0, pre-check=0"); 
Response.AppendHeader("Pragma", "no-cache"); 

Un exemple des en-têtes d'une page correcte:

Server ASP.NET Development Server/9.0.0.0 
Date Mon, 14 Jun 2010 17:22:24 GMT 
X-AspNet-Version 2.0.50727 
X-AspNetMvc-Version 2.0 
Pragma no-cache 
Expires Sun, 19 Nov 1978 05:00:00 GMT 
Last-Modified Mon, 14 Jun 2010 18:22:24 GMT 
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Content-Type text/html; charset=utf-8 
Content-Length 352 
Connection Close 

Et d'une page incorrecte:

 
Server ASP.NET Development Server/9.0.0.0 
Date Mon, 14 Jun 2010 17:27:34 GMT 
X-AspNet-Version 2.0.50727 
X-AspNetMvc-Version 2.0 
Pragma no-cache, no-cache 
Cache-Control private, s-maxage=0 
Content-Type text/html; charset=utf-8 
Content-Length 4937 
Connection Close 

Répondre

0

Pour gérer la cache de sortie, vous pouvez utiliser l'attribut OutputCache sur votre Action

EDIT

Si vous êtes à la recherche du code source AuthorizeAttribute, vous le verrez remplace la stratégie de cache de sortie et la raison en est dans les commentaires de ce code:

if (AuthorizeCore(filterContext.HttpContext)) { 
     // ** IMPORTANT ** 
     // Since we're performing authorization at the action level, the authorization code runs 
     // after the output caching module. In the worst case this could allow an authorized user 
     // to cause the page to be cached, then an unauthorized user would later be served the 
     // cached page. We work around this by telling proxies not to cache the sensitive page, 
     // then we hook our custom authorization code into the caching mechanism so that we have 
     // the final say on whether a page should be served from the cache. 

     HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache; 
     cachePolicy.SetProxyMaxAge(new TimeSpan(0)); 
     cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */); 

... 
} 
+0

Il a travaillé, mais pourquoi l'aide un attribut authorize remplace-t-il mon utilisation des en-têtes quand cela fonctionnait bien sans cela? – Chao

+0

@Chao Voir mon édition – Gregoire

Questions connexes