【问题标题】:Can not display .mht file in IE with IIS 7 when wrong MIME type is sent发送错误的 MIME 类型时,无法使用 IIS 7 在 IE 中显示 .mht 文件
【发布时间】:2024-04-30 11:30:02
【问题描述】:

我们在 ASP.NET 站点中有一个页面,其中包含指向 .MHT 文件的链接,因此当用户单击该链接时,他应该能够在浏览器中查看 MHT 文件。

问题是它显示为空白,而 IIS 发送的标头是这样的:

HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: application/octet-stream
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Wed, 18 Jan 2012 18:45:19 GMT

我们在 IIS 上已经按照默认设置正确配置了 MIME 类型,如下所示:

.mht    message/rfc822

我们注意到,如果我们通过我们机器中的文件系统打开文件,IE 会正确显示它,所以问题出在 IIS 随文件一起发送的标头上(我们假设)。

知道为什么 IIS 发送此标头会阻止我们正确显示 MHT 文件吗?有什么解决办法吗?

非常感谢!

更新

我们现在想到了几种解决方法:请参阅我的回答。

*谢谢大家!

【问题讨论】:

  • 感谢 Tomas,但该问题中显示的情况与我们的情况不同。我们不是从 ASP.NET 代码交付文件,它是指向位于我们服务器中的 MHT 文件的直接链接,而 IIS 是单独交付文件的人。问题如前所述:IIS 发送的 Content-Type 不正确,因此我们也无法将其设置为 multipart/related 作为该问题的答案。谢谢。
  • 但是您可以将扩展映射到自定义处理程序,当 IIS 无法完成工作时......
  • 再次感谢,是的,我已经用我们想到的三种解决方法更新了问题,我们将使用 ISAPI 过滤器,但我们会将 Content-Type 设置为 text/html 而不是多部分/相关。
  • 为了清楚起见,您必须发送正确的内容类型标头,否则 MHT 内容将无法正常工作。这是一项安全功能。

标签: asp.net internet-explorer iis mime-types


【解决方案1】:
  1. 使用 HTTP 处理程序:

    a) 在 system.web 下的 web.config 中添加类似如下的节点:

    <add verb="GET" path="*.mht" type="WebApplication1.Handler1" />
    

    b) 在 Handler's Code Behind 中,在 ProcessRequest 方法中添加:

    context.Response.ContentType = "message/rfc822"; 
    context.Response.Write(System.IO.File.ReadAllText(context.Server.MapPath(context.Request.FilePath)));
    
  2. 使用 ISAPI 过滤器更改 Content-Type 标头,然后再将其发送到客户端。您将需要 Windows 7 SDK for Server 2008 R2 或更早版本的 SDK,具体取决于您的目标服务器。

  3. 在 Global.asax 中,在这些事件之一中,更改 Content-Type 的标头值:

    a) Application_PreSendRequestContent

    或 b) Application_PreSendRequestHeaders

    这样做的缺点:你会拦截每个电话。

  4. 使用 CGI 脚本更改 Content-Type 标头值。

我们决定使用 HTTP Handler 解决方案。

问候,

法比安·费尔南德斯

【讨论】:

    【解决方案2】:

    你在所有方面都是正确的:

    1) 我首先要看的是本地浏览器配置 - 您已经验证 IE 可以正确打开本地文件

    2) 我要看的第二件事是 IIS 内容标头。你是对的:MS HTML (.mht) 文件的正确 MIME 类型应该是“message/rfc822”; Content-Type 应该是“application/octet-stream”。

    3) 此链接建议了几个不同的选择:

    http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/d94c0d4e-0d32-4648-bdd6-dc3f28bb4797/

    【讨论】:

    • 感谢您的快速回答,但我们已经前往该链接并尝试了其中提供的解决方案但没有结果,问题是提供的解决方案是针对客户端的,我们需要服务器能够正确传递 mht 文件。谢谢!
    【解决方案3】:

    .mht 文件是否与您的 asp.net 应用程序位于同一个 Web 应用程序中?如果它位于不同的 Web 应用程序/虚拟目录/Web 服务器中,则需要检查该特定位置的 MIME 类型。

    如果它在同一个 Web 应用程序中,请确保您在 IIS 中检查了该特定 Web 应用程序的 mime 类型,因为同一台计算机上的 Web 应用程序和网站之间的 mime 类型可能不同。

    【讨论】:

    • 感谢您的回答。是的,MHT 文件与 ASP.NET 站点位于同一 Web 服务器中。而且是的,我们已经检查了 ISS 服务器和应用程序的 MIME 类型,最后一个它说“继承”,所以它使用 IIS MIME 类型的配置,我说我们是如何拥有它的这个问题。谢谢!
    最近更新 更多