IIS 7经典模式Set-MaxAge在自定义HttpModule中

时间:2011-12-21 16:52:04

标签: asp.net iis iis-7 iis-7.5 httpmodule

我正在实施缓存机制。我编写了一个HTTPModule,它将拦截所有响应,并将buildnumber后缀为静态文件。并且还通过剥离内部版本号来重写请求中的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

缓存控件设置为私有时的响应标头

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 个答案:

答案 0 :(得分:2)

我在Win2k8 IIS7上遇到了同样的问题。我的决心是确保我在web.config的system.webServer部分注释掉缓存引用:

<!--<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>

同时确保没有&lt;%@ OutputCache%&gt;如果您正在使用一个页面处理程序的指令,并且您没有使用Response.Expires等覆盖缓存。

输出缓存将始终覆盖您的Response.Cache设置。

答案 1 :(得分:1)

在我看来,有些东西会覆盖你的设置。

当我使用经典模式的设置时,我得到了您的代码所需的内容。我也想知道你是否有一个HttpModule或HttpHandler也修改你的标题。我的直觉是其他一些代码正在覆盖您的响应设置。

检查此链接以确保IIS未正确设置: http://technet.microsoft.com/en-us/library/cc770661(WS.10).aspx