2011-01-07 14 views
12

Estoy intentando agregar un encabezado de "máximo de edad" a mi respuesta. Funciona bien en mi Visual Studio Development Server, pero tan pronto como muevo la aplicación a IIS (intenté IIS express localmente e IIS en el servidor), el encabezado desaparece.Cache.SetMaxAge no funciona en IIS, funciona bien en VS Dev Srv

Mi código:

Response.Cache.SetCacheability(HttpCacheability.Public); 
Response.Cache.SetMaxAge(new TimeSpan(1, 0, 0, 0)); 

respuesta del servidor VS Dev (todo funciona bien):

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Fri, 07 Jan 2011 14:55:04 GMT 
X-AspNet-Version: 2.0.50727 
Cache-Control: public, max-age=86400 

IIS7 Respuesta

HTTP/1.1 200 OK 
Server: Microsoft-IIS/7.5 
Date: Fri, 07 Jan 2011 15:00:54 GMT 
X-AspNet-Version: 2.0.50727 
Cache-Control: public 

PS. Es una ASHX-manipulador, si importa ...

Respuesta

25

ACTUALIZACIÓN: 2011-03-14 La solución es asegurarse de que llame SetSlidingExpiration (verdadero)

context.Response.Cache.SetCacheability(HttpCacheability.Public); 
context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(5)); 
context.Response.ContentType = "image/jpeg"; 
context.Response.Cache.SetSlidingExpiration(true); 

Si se quita el módulo OutputCache se quiere obtener el resultado deseado Veo esto como un error.

Así, en su web.config que haría lo siguiente:

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

añadido: Por lo tanto, no hay información adicional.

  1. Usando OutputCacheAttribute de MVC al parecer no tiene este problema
  2. Bajo la misma aplicación MVC, sin quitar "OutputCache" de los módulos, una aplicación directa si IHttpHandler o un ActionResult resultados en el s-maxage siendo despojados

la siguiente despoja a la s-maxage

  public void ProcessRequest(HttpContext context) 
    { 
     using (var image = ImageUtil.RenderImage("called from IHttpHandler direct", 5, DateTime.Now)) 
     { 
      context.Response.Cache.SetCacheability(HttpCacheability.Public); 
      context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(5)); 
      context.Response.ContentType = "image/jpeg"; 
      image.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
     }    
    } 

la siguiente despoja a la s-maxage

  public ActionResult Image2() 
    { 
     MemoryStream oStream = new MemoryStream(); 

     using (Bitmap obmp = ImageUtil.RenderImage("Respone.Cache.Setxx calls", 5, DateTime.Now)) 
     { 
      obmp.Save(oStream, ImageFormat.Jpeg); 
      oStream.Position = 0; 
      Response.Cache.SetCacheability(HttpCacheability.Public); 
      Response.Cache.SetMaxAge(TimeSpan.FromMinutes(5)); 
      return new FileStreamResult(oStream, "image/jpeg"); 
     } 
    } 

esto no - vaya usted a saber ...

[OutputCache(Location = OutputCacheLocation.Any, Duration = 300)] 
    public ActionResult Image1() 
    { 
     MemoryStream oStream = new MemoryStream(); 

     using (Bitmap obmp = ImageUtil.RenderImage("called with OutputCacheAttribute", 5, DateTime.Now)) 
     { 
      obmp.Save(oStream, ImageFormat.Jpeg); 
      oStream.Position = 0; 
      return new FileStreamResult(oStream, "image/jpeg"); 
     } 
    } 
2

Solución:

en web.config:

<staticContent> 
     <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="1.00:00:00"/> 
    </staticContent> 

y cuarto de PC IIS:

Con cmd ir a c:\windows\system32\inetsrv.

luego ejecutar:

appcmd unlock config /section:staticContent 
0

tardía contestado pero esto podría ayudar a alguien: -

Response.Cache.SetProxyMaxAge(TimeSpan.Zero); 
Cuestiones relacionadas