Cache.SetMaxAge not working under IIS, works fine under VS Dev Srv Cache.SetMaxAge not working under IIS, works fine under VS Dev Srv asp.net asp.net

Cache.SetMaxAge not working under IIS, works fine under VS Dev Srv


UPDATE: 2011-03-14 The fix is ensure you call SetSlidingExpiration(true)

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

If you remove the OutputCache module you will get the desired result. I see this as a bug.

So, in your web.config you would do the following:

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

ADDED: So, there's additional information.

  1. Using MVC's OutputCacheAttribute apparently doesn't have this issue
  2. Under the same MVC application, without removing "OutputCache" from the modules, a direct implementation if IHttpHandler or an ActionResult results in the s-maxage being stripped

The following strips the 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);        }                }

The following strips the 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");        }    }

This does NOT - go figure...

    [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");        }    }


Solution:

in web.config:

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

and en IIS PC:

With cmd go to c:\windows\system32\inetsrv.

Then execute:

appcmd unlock config /section:staticContent


Belated answered but this could help someone :-

Response.Cache.SetProxyMaxAge(TimeSpan.Zero);