IIS 7 классический режим Set-MaxAge в пользовательском HttpModule - PullRequest
2 голосов
/ 21 декабря 2011

Я реализую механизм кэширования. Я написал HTTPModule, который будет перехватывать все ответы и добавлять суффиксный номер к статическим файлам. А также перепишите URL в запросе, убрав номер сборки.

Я хочу установить MaxAge в ответе на будущую дату, скажем, год. Но когда я вижу это в скрипаче, он не устанавливает максимальный возраст. Я также пытался установить срок действия, но, похоже, не работает.

Отлично работает в интегрированном режиме IIS 7. Но не в классическом режиме.

 context.Response.Cache.SetCacheability(HttpCacheability.Public);                   
 context.Response.Cache.SetMaxAge(new TimeSpan(DateTime.Now.AddYears(1).Ticks));
 context.Response.Cache.SetExpires(DateTime.Now.AddYears(2));
 context.Response.AddHeader("Expires", DateTime.Now.AddYears(1).ToShortDateString());

Похоже, что ничего из этого не влияет на настройки кеша. Каков наилучший способ достичь этого? Я не хочу использовать интегрированный режим.

Обновление с информацией заголовка:

HTTP/1.1 200 OK 
Cache-Control: public 
Content-Type: image/gif 
Expires: Fri, 23 Dec 2011 14:53:12 GMT 
Last-Modified: Mon, 21 Nov 2011 11:50:11 GMT 
Accept-Ranges: bytes 
ETag: "1CCA843B92E5B80" 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Thu, 22 Dec 2011 14:53:12

Заголовки ответа, когда для элемента управления кэшем установлено значение private

HTTP/1.1 200 OK
Cache-Control: private, max-age=31536000
Content-Length: 2157
Content-Type: text/css
Expires: Sat, 24 Dec 2011 09:03:41 GMT
Last-Modified: Mon, 21 Nov 2011 11:50:09 GMT
Accept-Ranges: bytes
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 23 Dec 2011 09:03:41 GMT

Я включил код, который использую

  context.BeginRequest += new EventHandler(this.AddCacheExpiry);

  private void AddCacheExpiry(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;           

        if (context.Request.AppRelativeCurrentExecutionFilePath.IndexOf(BuildNumber) != -1)
        {
                context.Response.Cache.SetCacheability(HttpCacheability.Private);                   
                context.Response.Cache.SetMaxAge(new TimeSpan(DateTime.Now.AddYears(1).Ticks));
                context.Response.Cache.SetExpires(DateTime.Now.AddYears(2));
                context.Response.Cache.SetLastModifiedFromFileDependencies(); 
        }
    }

Ответы [ 2 ]

2 голосов
/ 16 января 2012

Я столкнулся с той же проблемой на Win2k8 IIS7.Я решил, что я закомментировал ссылки на кэширование в разделе system.webServer файла web.config:

<!--<caching>
  <profiles>
    <add extension=".ico" kernelCachePolicy="CacheUntilChange" />
    <add extension=".css" kernelCachePolicy="CacheUntilChange" />
    <add extension=".gif" kernelCachePolicy="CacheUntilChange" />
    <add extension=".js" kernelCachePolicy="CacheUntilChange" />
  </profiles>
</caching>-->

<staticContent>
  <!--<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />-->
</staticContent>

Также убедитесь, что у вас нет директив <% @ OutputCache%> в обработчике страницы, если выиспользуете один, и что вы не переопределяете кеш с помощью Response.Expires и т. д.

1 голос
/ 23 декабря 2011

Мне кажется, что что-то перезаписывает ваши настройки.

Когда я использовал ваши настройки в классическом режиме, я получил именно то, что хотел ваш код.Мне также интересно, если у вас есть HttpModule или HttpHandler, также модифицирующий ваши заголовки.Мне кажется, что какой-то другой код перезаписывает ваши настройки ответа.

Проверьте эту ссылку, чтобы убедиться, что IIS не настроен неправильно: http://technet.microsoft.com/en-us/library/cc770661(WS.10).aspx

...