我有一个MVC .Net应用程序,其中包含返回报告文件的操作,通常是
在测试和所有浏览器中都能很好地工作,但将其放在SSL网站上时,IE6、7和8会失败(所有适当的浏览器仍然可以正常工作),并显示以下无用错误消息:
使用Fiddler来动态更改这些内容,我们可以验证需要返回的标头。
注意
这是一个问题——我们广泛使用MVC的操作属性,我真的不想从头开始重写它们。即使我们可以,如果您尝试删除
如何使Microsoft的MVC和IIS返回Microsoft的IE6-8可以在HTTPS下处理的无缓存指令?我不希望允许响应的私有缓存(根据此similar question),也不要忽略MVC内置方法的覆盖(根据我的答案,这只是我当前最好的hack)。
.xslx
文件:byte[] data = GetReport();
return File(data,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"filename.xlsx");
在测试和所有浏览器中都能很好地工作,但将其放在SSL网站上时,IE6、7和8会失败(所有适当的浏览器仍然可以正常工作),并显示以下无用错误消息:
这在一个旧的应用程序(非MVC)中有效,而此操作则替代了该应用程序。
我们不能要求用户在本地进行任何更改 - 大约60%的用户仍在使用IE6!
我该如何使用MVC修复这个问题?
更新
进一步挖掘发现,这是IE6-8中的基本故障。根据Eric Law's IE internals blog,在SSL连接期间,IE将no-cache指令视为绝对规则。因此,它不是不缓存副本,而是认为no-cache意味着即使具有Content-Disposition:attachment
和显式提示下载位置,也不应该能够将副本保存到磁盘上。
显然,这是错误的,但尽管它在IE9中得到了修复,我们仍然被困在所有IE6-8用户中。
使用MVC的操作筛选器属性会产生以下标头:
Cache-Control:no-cache, no-store, must-revalidate
Pragma:no-cache
使用Fiddler来动态更改这些内容,我们可以验证需要返回的标头。
Cache-Control:no-store, no-cache, must-revalidate
注意
Cache-Control
的顺序必须在no-cache
之前有no-store
,并且Pragma
指令必须完全删除。这是一个问题——我们广泛使用MVC的操作属性,我真的不想从头开始重写它们。即使我们可以,如果您尝试删除
Pragma
指令,IIS也会抛出异常。如何使Microsoft的MVC和IIS返回Microsoft的IE6-8可以在HTTPS下处理的无缓存指令?我不希望允许响应的私有缓存(根据此similar question),也不要忽略MVC内置方法的覆盖(根据我的答案,这只是我当前最好的hack)。
Cache-Control: private
,这意味着如果用户在同一会话中两次下载相同的文件,则他们将从本地浏览器缓存中获取副本而不是最新数据。 这不是解决方法。 我需要告诉浏览器不要缓存(但允许下载),并以 IE 能够理解的格式告知。 - Keith