【问题标题】:How can I query IIS for MIME Type Mappings?如何在 IIS 中查询 MIME 类型映射?
【发布时间】:2011-04-25 16:13:14
【问题描述】:

如何以编程方式读取 IIS 的 MIME 类型?当我将数据流式传输到我的客户using WCF 时,我想使用它们。

任何提示或 API 将不胜感激

【问题讨论】:

    标签: iis iis-7 mime mime-types


    【解决方案1】:

    我假设这只是 IIS7,而您使用的是 C#3.0 或更高版本:

    using Microsoft.Web.Administration;
    ....
    using(ServerManager serverManager = new ServerManager())
    {
      // If interested in global mimeMap:
      var config = serverManager.GetApplicationHostConfiguration();
    
      // Use if interested in just a particular site's mimeMap:
      // var config = serverManager.GetWebConfiguration("Default Web Site");
    
      var staticContent = config.GetSection("system.webServer/staticContent");
      var mimeMap = staticContent.GetCollection();
    
      // Print all mime types
      foreach (var mimeType in mimeMap)
      {
        Console.WriteLine(String.Format("{0} = {1}", mimeType["fileExtension"],
             mimeType["mimeType"]));
      }
    
      // Find a mime type based on file extension
      var mt = mimeMap.Where(
            a => (string) a.Attributes["fileExtension"].Value == ".pdf"
          ).FirstOrDefault();
    
      if (mt != null)
      {
        Console.WriteLine("Mime type for .pdf is: " + mt["mimeType"]);
      }
    }
    

    您需要在c:\windows\system32\inetsrv 中引用Microsoft.Web.Administration.dll

    您的代码也需要管理员权限才能执行此操作。

    【讨论】:

    • 我终于开始实施这个了,看来我需要让IUSR访问C:\Windows\System32\inetsrv。根据我的阅读,这会显着降低系统安全性。你有什么想法?
    • @maker - 请参阅我的回答的最后一句话“您的代码也需要管理员权限才能执行此操作。”。您是正确的,允许站点的匿名用户帐户具有提升的权限不是一个好主意。我通过在一个单独的进程(Windows 服务托管远程处理或 WCF 应用程序)中对高特权操作进行沙盒处理来解决这个问题,并且只公开完成手头工作所需的特定功能。
    • @maker - 如果您只是在阅读这些值,那么 Carlos Aguilar Mares 的这篇文章可能会有用:blogs.msdn.com/b/carlosag/archive/2011/01/21/…
    【解决方案2】:

    如果使用 ASP.Net 4.5 或更高版本,您可以使用System.Web.MimeMapping.GetMimeMapping,如下所示:

    void Page_Init()
    {
        string[] extensions = new string[]
        {
            ".pdf",
            ".xls",
            ".xlsx",
            ".ppt",
            ".pptx",
            ".mp3",
            ".ogg",
            ".svg",
            ".pdf",
            ".png",
        };
    
        foreach (string extension in extensions)
        {
            string mimeType = MimeMapping.GetMimeMapping(extension);
            Response.Write(String.Format("{0} => {1}<br />",
                    extension,
                    mimeType
                ));
        }
    }
    

    结果:

    .pdf => application/pdf
    .xls => application/vnd.ms-excel
    .xlsx => application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    .ppt => application/vnd.ms-powerpoint
    .pptx => application/vnd.openxmlformats-officedocument.presentationml.presentation
    .mp3 => audio/mpeg
    .ogg => video/ogg
    .svg => image/svg+xml
    .pdf => application/pdf
    .png => image/png
    

    【讨论】:

    • 不知道为什么这不是公认的答案。好吧,这是否需要管理员权限..?
    • 它不需要管理员权限。当这个问题最初被问到库函数不存在时,OP选择了当时的最佳答案。我一直使用较新的方法,它对我很有用。
    【解决方案3】:

    注册到系统的 Mime 类型在注册表中的“HKEY_CLASSES_ROOT\Mime\Database\Content Type”下定义。

    您是否正在寻找 IIS 中定义的特定网站的 mime 类型?

    【讨论】:

      【解决方案4】:

      作为读取注册表或降低配置目录安全性的替代方法,HTML Agility Pack 中有一个预先填充的 MIME 数据库

      【讨论】:

      • 一句警告 HtmlAgilityPack 1.4.0.0 仅使用注册表项 HKEY_CLASSES_ROOT。因此,您需要访问注册表和要在服务器上注册的文件类型。这篇博文还不错codelog.climens.net/2009/10/28/…
      猜你喜欢
      • 2012-01-09
      • 2012-02-19
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多