2011-01-07 18 views
12

Próbuję dodać nagłówek "max-age" do mojej odpowiedzi. Działa to dobrze na moim serwerze Visual Studio Development Server, ale jak tylko przeniesię aplikację do IIS (wypróbowałem zarówno IIS express local, jak i IIS na serwerze) - nagłówek znika.Cache.SetMaxAge nie działa pod IIS, działa dobrze pod VS Dev Srv

Mój kod:

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

VS Dev odpowiedzi serwera (wszystko działa dobrze):

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 Response

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. Jest to ashx-handler, jeśli to ma znaczenie ...

Odpowiedz

25

UPDATE: 2011-03-14 Rozwiązaniem jest zapewnienie zadzwonić 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); 

Po wyjęciu modułu OutputCache Ci będzie uzyskać pożądany wynik. Widzę to jako błąd.

Tak w web.config byłoby wykonać następujące czynności:

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

Dodano: Tak, istnieje dodatkowa informacja.

  1. Korzystanie MVC za OutputCacheAttribute najwyraźniej nie ma tego problemu
  2. Pod tym samym MVC aplikacji, bez konieczności zdejmowania „OutputCache” z modułów, w bezpośredniej realizacji jeśli IHttpHandler albo Wyniki ActionResult w S-maxage są usuwane

Poniżej pasków 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); 
     }    
    } 

Poniżej pasków 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"); 
     } 
    } 

to nie - idź figura ...

[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

Rozwiązanie:

w web.config:

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

i en IIS PC:

Z cmd przejść do c:\windows\system32\inetsrv.

Następnie wykonać:

appcmd unlock config /section:staticContent 
0

Spóźniony odpowiedział, ale może to komuś pomóc -

Response.Cache.SetProxyMaxAge(TimeSpan.Zero);