2009-02-16 22 views
7

Quiero poder establecer un tiempo de caducidad prolongado para ciertos elementos que un usuario descarga a través de la solicitud GET.¿Cuál es la mejor manera de trabajar con el encabezado Expires en ASP.NET MVC?

Quiero decir 'esto es bueno durante 10 minutos' (es decir, quiero establecer un encabezado Expires por más de 10 minutos). Las solicitudes son fragmentos de HTML que se muestran en la página a través de AJAX y son buenos para la sesión del usuario. No quiero volver al servidor y obtener un 304 si los necesitan de nuevo. Quiero que el caché del navegador me dé el mismo elemento al instante.

Encontré un artículo que tiene casi un año aproximadamente MVC Action filter caching and compression. Esto crea un ActionFilter personalizado para cambiar el encabezado expira. Ya estoy usando el filtro de compresión, que funciona muy bien para algunos css personalizados que estoy generando (¡tasa de compresión del 94%!).

Tengo dos preocupaciones principales:

1) ¿Realmente tengo que utilizar este método. Estoy de acuerdo si lo hago, pero ¿realmente no hay funcionalidad en MVC o la funcionalidad de OutputCache para hacer esto por mí? En ASP.NET 'tradicional', siempre configuré el encabezado Expires manualmente, pero ya no podemos hacer eso, al menos no en el controlador.

2) Si utilizo este método de filtro - ¿va a interferir en absoluto con la política de OutputCache? Que deseo poder controlar en web.config. Estoy pensando que los dos son mutuamente exclusivos y que no querrías los dos, pero no estoy del todo seguro.

Respuesta

3
  1. No, no ¿Tiene utilizar este método. Sin embargo, creo que es probablemente el mejor método para elegir, ya que hace que el controlador sea más comprobable y menos sensible a la web. La alternativa sería establecer el encabezado manualmente en el Controlador, así:

    Response.AddHeader ("Caduca", "Jue, 01 Dec 1994 16:00:00 GMT");

  2. Bueno, el atributo OutputCache controla cuándo se ejecuta la acción y cuándo devuelve el HTML en caché. Caduca le dice al navegador cuándo volver a buscar el HTML. Así que no los llamaría mutuamente exclusivos, pero ciertamente son dos caras de la misma moneda, y tiene razón al pensar que puede no necesitar ambos. Sugiero que revise the HTTP spec para decidir cuál es el más apropiado para su aplicación.

+0

@craig gracias por sus comentarios. Supongo que una regla general con respecto al n. ° 2 es que si la vista generada es muy simple (es decir, no tiene acceso a la base de datos), entonces caducar puede ser todo lo que se necesita. si se requieren diez llamadas a métodos web, entonces debería usar OutputCache. a veces quieres caras Y colas correctas :-) –

+3

Considera: si 10 personas (en computadoras diferentes) solicitan tu página 10 veces cada una, Caduca por sí solo significa que tu acción se ejecuta 10 veces y el servidor maneja 10 solicitudes. El almacenamiento en caché solo significa que su acción se ejecuta una vez y el servidor maneja 100 solicitudes. Vence y almacena en caché juntos significa que su acción se ejecuta una vez y el servidor maneja 10 solicitudes. –

2

Response.Expires Esta propiedad especifica el número de minutos antes de una página en caché en el navegador es decir expira. si el usuario vuelve a la misma página antes de la cantidad de minutos especificada, se muestra la versión en caché de la página.

Response.ExpiresAbsolute Utilizando esta propiedad podemos ajustar la fecha y/o hora en que página en caché en el navegador expira.

http://forums.asp.net/t/1532229.aspx

0

Parece que sólo tiene que variar de usuario:

http://aspadvice.com/blogs/ssmith/archive/2007/10/29/VaryByCustom-Caching-By-User.aspx

[OutputCache(Duration="10", VaryByCustom="username")] 

Global.asax:

public override string GetVaryByCustomString(HttpContext context, string key) 
{ 
    switch(key) 
    { 
     case "username": 
      return context.User.Identity.Name; 

     // Other VaryByCustom strategy implementations can go here. 
    } 

    return string.Empty; 
} 
Cuestiones relacionadas