历史:
出于安全考虑,我们的组织希望通过向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
答案 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”);