无法使用PreSendRequestHeaders()覆盖IIS中的http缓存头

时间:2011-10-17 21:29:36

标签: asp.net iis-6 http-headers

历史:
出于安全考虑,我们的组织希望通过向IIS添加HTTP标头来禁用缓存。

过期:-1
Pragma:no-cache
缓存控制:无缓存,无存储

添加这些标头会导致MIME“ application / vnd.ms-excel ”响应类型在 IE6 中对 SSL 进行故障转移。微软承认这是一个错误(http://support.microsoft.com/kb/323308),他们的解决方案也有效。但是,这个解决方案必须在整个组织中作为补丁推进,并且面临来自更高管理层的阻力。

问题:
同时,我们正在尝试通过在 PreSendRequestHeaders()函数上使用 HTTPModules 覆盖MIME类型为“application / vnd.ms-excel”的页面的IIS设置HTTP标头来寻找替代方案

//this is just a sample code
public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += new EventHandler(context_PreSendRequestHeaders);

        }
protected void context_PreSendRequestHeaders(object sender, EventArgs e) 
        {
            HttpApplication application = (HttpApplication)sender;
            if(application.Response.ContentType == "application/vnd.ms-excel; name=DataExport.xls")
            {
                application.Response.ClearHeaders();
                application.Response.ContentType = "application/vnd.ms-excel; name=DataExport.xls";
                application.Response.AddHeader("Content-Transfer", "Encoding: base64");
                application.Response.AddHeader("Content-Disposition", "attachment;filename=DataExport.xls");
                application.Response.AddHeader("cache-control","private");
            }
        }

即使在使用ClearHeaders()清除标头后,IIS仍会在发送响应之前附加缓存标头。

问题:
这种在PreSendRequestHeaders()函数中使用ClearHeaders()的方法是错误的吗? 它们是否可以使用ASP.NET 1.1中提供的库来覆盖缓存标头(Expires,Pragma,缓存控制)?

其它
我们正在使用
浏览器:IE6 SP 3
服务器:IIS 6
平台:.NET 1.1

2 个答案:

答案 0 :(得分:2)

IIS 7.5+使用URL Rewrite extention并添加出站规则以去除Cache-Control标头中的“no-store”值和Pragma标头,这变得更容易了。这个规则集可以解决问题:

<outboundRules>
    <rule name="Always Remove Pragma Header">
        <match serverVariable="RESPONSE_Pragma" pattern="(.*)" />
        <action type="Rewrite" value="" />
    </rule>
    <rule name="Remove No-Store for Attachments">
        <conditions>
            <add input="{RESPONSE_Content-Disposition}" pattern="attachment" />
        </conditions>
        <match serverVariable="RESPONSE_Cache-Control" pattern="no-store" />
        <action type="Rewrite" value="max-age=0" />
    </rule>
</outboundRules>

答案 1 :(得分:1)

请参阅:

Cache-control: no-store, must-revalidate not sent to client browser in IIS7 + ASP.NET MVC

您必须在PreSendRequestHeaders处理程序中使用以下调用序列来正确设置no-cache标头,否则稍后会覆盖Cache-Control标头:

  

Response.Cache.SetCacheability(HttpCacheability.NoCache);      Response.Cache.AppendCacheExtension(“no-store,must-revalidate”);      Response.AppendHeader(“Pragma”,“no-cache”);      Response.AppendHeader(“Expires”,“0”);