2011-12-21 1 views
2

Я реализую механизм кэширования. Я написал HTTPModule, который перехватил бы весь ответ и суффикс buildnumber для статических файлов. А также перепишите URL-адрес в запросе, сняв номер сборки.IIS 7 classic mode Set-MaxAge в пользовательском HttpModule

Я хочу установить 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 

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

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(); 
     } 
    } 
+0

Можете ли вы опубликовать, как выглядит ваш заголовок http? Интегрированный и классический режим ставит максимальный возраст в разные части заголовка. «Кэш-контроль» против «Истекает» – Etch

+0

HTTP/1.1 200 OK Cache-Control: public Тип контента: image/gif Истекает: Пт, 23 Дек 2011 14:53:12 GMT Last-Modified: Mon, 21 ноября 2011 11:50:11 GMT Accept-Диапазоны: байты ETag: "1CCA843B92E5B80" сервер: Microsoft-IIS/7.5 X-Сеть САШ-Version: 4.0.30319 X-Powered-By: ASP.NET Дата: Чт, 22 дек. 2011 14:53:12 GMT – Suhumar

+0

По умолчанию он истекает на следующий день. Не уверен, что это сделано с помощью IIS – Suhumar

ответ

2

Я столкнулся с той же проблемой, на 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 и т. д.

Выходное кэширование всегда будет переопределять настройки Response.Cache.

+0

Спасибо Эшли за ваши входы. Я попробую их. – Suhumar

1

Это смотрит на меня, что что-то переписывает ваши настройки.

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

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

+0

У меня есть только HttpModule, который изменяет заголовки ответов. Также странно, когда я устанавливаю кеш-контроль в закрытый, он устанавливает максимальный возраст. Но все же истекает срок, установленный на следующий день. Я также убедился, что в настройках заголовков служб IIS нет настройки, которая устанавливает дату истечения срока действия.Невозможно выяснить, откуда установлена ​​дата истечения срока действия. – Suhumar

+0

Хм, это похоже на странный. Я делал это несколько раз, обычно в HttpHandler и HttpModule, но вы должны иметь возможность сделать это в модуле. Какое событие вы устанавливаете во всей своей информации заголовка? Возможно, разместите полный код события. – Etch