gpt4 book ai didi

asp.net-mvc - IE6-8 无法从 HTTPS 站点下载文件

转载 作者:行者123 更新时间:2023-12-04 03:53:03 26 4
gpt4 key购买 nike

我有一个 MVC .Net 应用程序,它具有返返回告文件的操作,通常是 .xslx :

byte[] data = GetReport();
return File(data,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"filename.xlsx");

这在测试和所有浏览器中都非常有效,但是当我们将它放在 SSL 站点上时,它在 IE6、7 和 8(所有正确的浏览器仍然可以正常工作)上失败,并出现这个无益的错误:

Unable to download filename from server. Unable to open this Internet site. The requested site is either unavailable or cannot be found. Please try again later.

这曾经在此操作替换的遗留应用程序(非 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 的操作过滤器属性会生成以下 header :
Cache-Control:no-cache, no-store, must-revalidate
Pragma:no-cache

使用 Fiddler 动态更改这些,我们可以验证需要返回的 header :
Cache-Control:no-store, no-cache, must-revalidate

注意 Cache-Control 的顺序 必须no-store之前 no-cache并且 Pragma指令 必须被完全删除。

这是一个问题——我们广泛使用 MVC 的 Action 属性,我真的不想从头开始重写它们。即使我们可以在您尝试删除 Pragma 时 IIS 抛出异常指示。

如何让微软的 MVC 和 IIS 返回微软的 IE6-8 在 HTTPS 下可以处理的 no-cache 指令?我不想允许对响应进行私有(private)缓存(根据此 similar question )或忽略带有覆盖的 MVC 内置方法(根据我自己的答案,这只是我目前最好的 hack)。

最佳答案

我想出了一个解决方法,但这是一个明确的 hack - 这是一个新的缓存属性,用于替换内置的 [OutputCache]一:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class IENoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.IsSecureConnection &&
string.Equals(filterContext.HttpContext.Request.Browser.Browser, "IE", StringComparison.OrdinalIgnoreCase) &&
filterContext.HttpContext.Request.Browser.MajorVersion < 9)
{
filterContext.HttpContext.Response.ClearHeaders();
filterContext.HttpContext.Response.AddHeader("cache-control", "no-store, no-cache, must-revalidate");
}
else
{
filterContext.HttpContext.Response.Cache.SetNoStore();
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
}

base.OnResultExecuting(filterContext);
}
}

不过,这充其量只是一种解决方法——我真正想要的是扩展现有的 [OutputCache]Response.Cache结构,以便它们具有适合传统 IE 的所需输出。

关于asp.net-mvc - IE6-8 无法从 HTTPS 站点下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13119340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com