2010-06-03 13 views
6

Tengo un problema con IE almacenando en caché los resultados de un método de acción.Cómo detener el almacenamiento en caché de MVC los resultados de invocar un método de acción?

Otros artículos que encontré están relacionados con la seguridad y el atributo [Autorizar]. Este problema no tiene nada que ver con la seguridad.

Este es un método muy simple de "registrar un voto, obtener el promedio, devolver el promedio y el número de votos". Lo único ligeramente interesante es que se invoca a través de Ajax y devuelve un objeto Json. Creo que es el objeto Json el que se almacena en caché.

Cuando lo ejecuto desde FireFox y miro el tráfico XHR con Firebug, todo funciona perfectamente. Sin embargo, en IE 8, el gráfico "throbber" nunca tiene tiempo para mostrarse y los elementos de página que muestran el promedio "nuevo" y el recuento que se inyectan en la página con jQuery nunca son diferentes.

Necesito una forma de decirle a MVC que nunca guarde en caché este método de acción.

Este artículo parece abordar el problema, pero no puedo entenderlo: Prevent Caching of Attributes in ASP.NET MVC, force Attribute Execution every time an Action is Executed

necesito un poco más de contexto para la solución de entender cómo extender AuthorizationAttribute. Por favor, dirija su respuesta como si estuviera hablando con alguien que no tiene un conocimiento profundo de MVC, incluso si eso significa responder con un artículo sobre algunos requisitos básicos/requisitos que se requieren.

Gracias,

Trey Carroll

Respuesta

21

MVC no almacena en caché los resultados. IE lo hace.

Así que tienes que decirle a IE que no lo haga.

Así es como lo hago. En primer lugar, un atributo:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public sealed class CacheControlAttribute : ActionFilterAttribute 
{ 
    public CacheControlAttribute(HttpCacheability cacheability) 
    { 
     this._cacheability = cacheability; 
    } 

    public HttpCacheability Cacheability { get { return this._cacheability; } } 

    private HttpCacheability _cacheability; 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(_cacheability); 
    } 
} 

A continuación, una acción:

[CacheControl(HttpCacheability.NoCache), HttpGet] 
    public JsonResult MyAction() 
+0

Gracias Craig. Esto es exactamente lo que necesitaba. Sin embargo, acabo de agregar la clase al nivel de raíz del proyecto MVC, que estoy seguro es incorrecta. ¿Cuál sería la ubicación correcta para esta clase en una solución MVC 2? –

+0

Depende de usted. Esto es, efectivamente, código de marco. Puede colocarlo en una biblioteca de clases separada o en un espacio de nombres "Mvc" en su aplicación web. –

+3

Esto es mucho más simple en MVC ahora, sólo tiene que utilizar OutputCache y establecer la duración de cero segundos: [OutputCache (Duración = 0)] pública ActionResult ciudades (int provinceId) {var myData = SomeClassInstance.SomeMethod(); return Json (myData, JsonRequestBehavior.AllowGet); } –

Cuestiones relacionadas