C# IE8韩元';t下载具有启用UAC的自定义mime/类型的文件

C# IE8韩元';t下载具有启用UAC的自定义mime/类型的文件,c#,windows-7,internet-explorer-8,uac,mime-types,C#,Windows 7,Internet Explorer 8,Uac,Mime Types,我在本地计算机(Windows7x64、IE8、.NET3.5、C#)上运行了一个.net服务,它将文件返回到浏览器以响应用户操作。使用firefox或chrome,文件被正确下载,我们的应用程序通过自定义mime类型启动,一切正常 但是,在IE8中,我收到一个对话框“无法从下载文件。无法打开此internet站点。请求的站点不可用或找不到。请稍后再试” 使用fiddler,我验证IE是否从服务接收有效负载 如果我关闭UAC,IE会下载文件并启动相关应用程序 关闭UAC不是一个可行的解决方案,因

我在本地计算机(Windows7x64、IE8、.NET3.5、C#)上运行了一个.net服务,它将文件返回到浏览器以响应用户操作。使用firefox或chrome,文件被正确下载,我们的应用程序通过自定义mime类型启动,一切正常

但是,在IE8中,我收到一个对话框“无法从下载文件。无法打开此internet站点。请求的站点不可用或找不到。请稍后再试”

使用fiddler,我验证IE是否从服务接收有效负载

如果我关闭UAC,IE会下载文件并启动相关应用程序

关闭UAC不是一个可行的解决方案,因为我们的客户将启用它

如何让IE8启动启用UAC的关联应用程序

编辑:

如前所述,使用编程id重新注册mime类型后,我可以让IE打开并在第二次从地址栏请求链接时显示“打开或保存”对话框。为什么第一次就不行了

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

最后,如果没有内容类型或内容配置数据,并且MIME嗅探无法识别已知的MIME类型,则将文件扩展名设置为与用于下载文件的URL相同的扩展名

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

content disposition=attachment这就是解决方案吗

/二岭大坝
DNS-IT ApS

我今天能够解决这个问题。原来codebehind正在将响应的
CacheControl
属性设置为
HttpCacheability.NoCache
。删除这行代码解决了这个问题。修复的另一半是用ProgId正确注册mime类型和文件扩展名

我只对
内容配置:附件进行了精简;filename=xxx
和字符串数据的二进制写入。IE正确显示了“打开或保存”对话框,即使mime嗅探报告文件为text/html(实际上应该是text/plain)


我添加了内容类型头并重新测试,然后添加了nosniff选项并重新测试,最后添加了缓存控件。在每次测试之间,我重新启动VM以确保它是一个原始的测试环境(即,没有缓存或预加载任何内容)。只有缓存控制线以负面方式影响了行为。

的ClickOnce部署中也存在同样的问题。我怀疑这与IE在获取应用程序/八位字节流时所做的“MIME类型嗅探”有关——我猜是为了保护用户免受恶意内容的攻击


无论如何,为了解决这个问题,我们将.deploy文件的mime类型更改为text/plain-显然不理想,但同时,我不知道在什么情况下,我们的服务器上可能有一个.deploy文件,用户可以浏览到外部ClickOnce。

对于我来说,这个问题的解决方案正在改变

Response.ContentType = "application/vnd.ms-excel"; Response.ContentType=“application/vnd.ms excel”; 到

Response.ContentType=“text/csv”;
需要确保“无缓存”之前的标题中出现“无存储”。请参阅本文:

是否需要自定义MIME类型?
application/octet-stream
不够吗?好问题。据我所知,IE是如何决定用什么程序来启动应用程序的。这是一个闭环,它是我们的数据文件和查看器。我们还能怎么做呢?如果你使用一个通用的mime类型,比如应用程序/八位字节流和一个自定义的文件扩展名,你已经在你的查看器中注册了(在你的查看器的安装程序中),IE(和其他所有东西)会显示它吗?如果我切换到八位字节流,IE会显示“打开”或“保存”对话框。如果我选择“打开”,它将在浏览器中而不是在关联的应用程序中打开它。如果我将internet区域的安全滑块降到最低设置(使用自定义mime类型),则即使启用了保护模式,也会启动关联的应用程序。它必须是mime类型吗?按文件扩展名关联不起作用吗?那是什么样的文件?不,不是这样,虽然看起来应该是这样。乍一看,这似乎是一个成功的尝试;但这对我很管用。另请参见[MSDN博客上提出的相同解决方案] Response.ContentType = "text/csv";