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.
- Using MVC's OutputCacheAttribute apparently doesn't have this issue
- 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);