IE8在启用UAC的情况下无法下载自定义MIME /类型文件

5
我有一个在本地机器上运行的 .net 服务(Windows 7 x64,IE8,.net 3.5,C#),响应用户操作时向浏览器返回一个文件。使用 Firefox 或 Chrome,文件可以正确下载,并通过自定义 MIME 类型启动我们的应用程序,一切正常。
然而,在 IE8 中,我收到一个对话框:“无法从 . 下载文件。无法打开此网站。所请求的网站要么不可用,要么无法找到。请稍后再试。”
使用 Fiddler,我验证了 IE 确实从服务接收了有效负载。
如果我关闭 UAC,则 IE 可以下载文件并启动关联的应用程序。
关闭 UAC 不是可行的解决方案,因为我们的客户将启用它。
如何使 IE8 在启用 UAC 的情况下启动相关应用程序?
在使用编程方式重新注册mime类型的程序标识符(如此处所述)后,我可以让IE在从地址栏第二次请求链接时打开“打开或保存”对话框。为什么第一次不起作用呢?

自定义 MIME 类型真的必要吗?application/octet-stream 不就可以了吗? - Joey
好问题。据我所知,这是IE确定使用哪个程序来启动应用程序的方式。这是一个封闭的循环,这是我们的数据文件和我们的查看器。否则我们还能怎么做呢? - Jeff Paquette
如果您使用类似于application/octet-stream的通用MIME类型和已在查看器中注册的自定义文件扩展名(在您的查看器安装程序中),那么IE(以及其他所有内容)是否会显示它? - Samuel Neff
必须是MIME类型吗?文件扩展名关联不起作用吗?那是什么类型的文件? - Pekka
这是一个文本文件,其中包含要传递给处理程序的命令行参数。 - Jeff Paquette
显示剩余2条评论
5个回答

5
我今天解决了这个问题。原来是代码后台将响应的CacheControl属性设置为HttpCacheability.NoCache。删除该行代码解决了该问题。另一半的修复工作是正确地使用ProgId注册mime类型和文件扩展名。
我将响应简化为只有content-disposition: attachment; filename=xxx和字符串数据的二进制写入。IE正确地显示了打开或保存对话框,尽管mime嗅探将文件报告为text/html(实际上应该是text/plain)。
我添加了内容类型头并重新测试,然后添加了nosniff选项并重新测试,最后添加了缓存控制。在每个测试之间,我重新启动了虚拟机,以确保它是一个原始的测试环境(即没有缓存或预加载)。只有缓存控制行会以负面方式影响行为。

1

来自MSDN

如果Internet Explorer知道指定的Content-Type并且没有Content-Disposition数据,它会执行“MIME嗅探”,扫描文件的前200个字节以确定文件结构是否与任何已知的MIME类型匹配。有关MIME嗅探的更多信息,请参阅Internet Explorer中的MIME类型检测。如果MIME嗅探检测到Internet Explorer已知的MIME类型,并且文件尚未被mimefilter加载,则Internet Explorer在将文件放入本地浏览器缓存之前设置该文件扩展名。

最后,如果没有Content-Type或Content-Disposition数据,并且MIME嗅探不识别已知的MIME类型,则文件扩展名设置为用于下载文件的URL相同的扩展名。

如果文件在HTTP标头中标记为“content-disposition = attachment”,则Internet Explorer将URL中的文件名视为最终文件名,并在将其放入缓存之前不对其进行重命名。

content-disposition = attachment是解决方案吗?!?

/ Erling Damsgaard DNS-IT ApS


不,那不是它,尽管它看起来应该是。 - Jeff Paquette

1

我们在www.Qiqqa.com的ClickOnce部署中遇到了相同的问题。我怀疑这与IE在获取application/octet-stream时执行的“MIME类型嗅探”有关 - 我想是为了保护用户免受恶意软件的影响。

不管怎样,为了解决这个问题,我们将.deploy文件的mime类型更改为text/plain - 显然并不理想,但同时,我不知道我们的服务器上会有什么场景下用户会在ClickOnce之外浏览到.deploy文件。


1

这乍一看似乎是一个试错过程,但对我起作用了。另请参见[MSDN博客上提出的相同解决方案] http://blogs.msdn.com/b/ieinternals/archive/2009/10/03/internet-explorer-cannot-download-over-https-when-no-cache.aspx?PageIndex=2 - somshivam

0
对我来说,解决这个问题的方法是将
Response.ContentType = "application/vnd.ms-excel";
更改为
Response.ContentType = "text/csv";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接