Cache.SetMaxAge не работает под IIS, отлично работает под VS Dev Srv - PullRequest
14 голосов
/ 07 января 2011

Я пытаюсь добавить заголовок "max-age" к моему ответу. Он отлично работает на моем Visual Studio Development Server, но как только я переместил приложение на IIS (пробовал локально использовать IIS express и IIS на сервере) - заголовок исчезает.

Мой код:

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

Ответ сервера VS Dev (все работает просто отлично):

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

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. Это ASHX-обработчик, если это имеет значение ...

Ответы [ 3 ]

27 голосов
/ 11 марта 2011

ОБНОВЛЕНИЕ: 2011-03-14 Исправление гарантирует, что вы вызываете 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);

Если вы удалите модуль OutputCache, вы получите желаемый результат. Я вижу это как ошибку.

Итак, в вашем файле web.config вы должны сделать следующее:

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

ДОБАВЛЕНО: Итак, есть дополнительная информация.

  1. Использование MVC для OutputCacheAttribute, по-видимому, не имеет этой проблемы
  2. В том же приложении MVC без удаления «OutputCache» из модулей прямая реализация, если IHttpHandler или ActionResult приводит к удалению s-maxage

Следующие полоски 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);
        }            
    }

Следующие полоски 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");
        }
    }

Это НЕ - пойди разберись ...

    [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 голосов
/ 01 октября 2011

Решение:

in web.config:

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

и en IIS PC:

С cmd перейти на c:\windows\system32\inetsrv.

Затем выполните:

appcmd unlock config /section:staticContent
0 голосов
/ 04 ноября 2016

Запоздалый ответил, но это может кому-то помочь: -

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