我有一个返回FileStreamResult的MVC4 GET动作方法.存在一种要求,即仅使用SSL并且不允许缓存所提供的文档,因此使用SSL,并且我还使用具有以下属性的OutputCache过滤器:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None", Location = OutputCacheLocation.None)]
Run Code Online (Sandbox Code Playgroud)
这符合预期,并产生以下响应标头:
Cache-Control: no-cache, no-store
Expires: -1
Pragma: no-cache
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到被要求也支持IE8,并且这里的许多人也遇到了文件,不会同时下载no-cache set和SSL.IE8及以下的解释是添加一些实际上不可行的注册表设置,或者删除违反基本要求的无缓存标头.
我尝试使用Fiddler和IE8并且能够下载文件,如果我刚删除了pragma:no-cache标头但保留了Cache-Control.这似乎没有在我的临时Internet文件中留下文档的副本,但我可能需要对此进行更多测试.
考虑到这些信息,我认为使用操作过滤器删除编译指示可能是一项简单的任务,但似乎无论我做什么,我无法更改OutputCache将要设置的任何内容.我甚至删除了OutputCache属性并使用了:
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Run Code Online (Sandbox Code Playgroud)
单独使用此方法可确保我获得与以前相同的缓存设置,但不会在此方法调用时设置它们.这只是设置缓存策略,该策略在响应管道中的某个点应用,但我不知道在哪里.
有没有人知道是否有一种方法可以连接到响应管道以在写入时更改缓存头?
编辑 我已经在管道中添加了一个简单的自定义IHttpModule,它在响应NameValueCollection中查找并删除任何Pragma头,并且在设置缓存控件时,pragma不存在.这是否意味着IIS 7.5正在根据它在缓存控件中看到的内容插入pragma本身?我知道我没有为一个简单的网站设置超出默认值的东西.
编辑 检查模块中的Cache-Control标头值并将其设置为私有,以便缓存标头尚未应用于响应.因此,在执行模块后,似乎会添加缓存标头?
我有以下代码,部署在https Asp站点上,使用MVC 4.0构建:
public FileResult ANotSoWorkingFunction(string filePath, string fileName)
{
pathToFile = string.Format("~/{0}/{1}", pathToFile, fileName);
return File(new FileStream(pathToFile, FileMode.Open), "application/pdf", fileName);
}
Run Code Online (Sandbox Code Playgroud)
这对于Chrome,Firefox和IE9来说都是可行的(正如你们许多人可能已经猜到的那样).但它会抛出一个:
---------------------------
Windows Internet Explorer
---------------------------
Internet Explorer cannot download someFileName from a_site.com.
Internet Explorer was not able to open this Internet site. The requested site is either unavailable or cannot be found. Please try again later.
---------------------------
OK
---------------------------
Run Code Online (Sandbox Code Playgroud)
在IE6,7,8上
非常感谢任何关于这个的想法或线索,因为我已经花了很多时间玩html标题.
编辑:
以下是IE7的标题:
HTTP/1.1 200 OK
Cache-Control: private, no-cache="Set-Cookie"
Content-Type: application/pdf
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319 …Run Code Online (Sandbox Code Playgroud)