【问题标题】:ASP.NET/IIS6: How to search the server's mime map?ASP.NET/IIS6:如何搜索服务器的 MIME 地图?
【发布时间】:2010-09-15 13:12:17
【问题描述】:

我想从代码隐藏文件中找到 IIS ASP.NET Web 服务器上给定文件扩展名的 MIME 类型。

我想搜索服务器本身在提供文件时使用的相同列表。这意味着将包含网络服务器管理员添加到 Mime 地图 的任何 mime 类型。

我可以盲目使用

HKEY_CLASSES_ROOT\MIME\Database\Content Type

但这没有记录为与 IIS 使用的相同列表,也没有记录 Mime Map 的存储位置。

我可以盲目地调用FindMimeFromData,但这并没有记录为 IIS 使用的同一个列表,我也不能保证 IIS Mime Map 也会从该调用中返回。

【问题讨论】:

    标签: asp.net iis mime mime-types


    【解决方案1】:

    IIS 将 MIME 信息存储在它自己的数据库中。在互联网上搜索“MimeMap IIS”将揭示如何阅读甚至更改它。例如见C# - How to display MimeMap entries to the console from an instance of IIS.

    【讨论】:

      【解决方案2】:

      这是我之前做的一个:

      public static string GetMimeTypeFromExtension(string extension)
      {
          using (DirectoryEntry mimeMap = 
                 new DirectoryEntry("IIS://Localhost/MimeMap"))
          {
              PropertyValueCollection propValues = mimeMap.Properties["MimeMap"];
      
              foreach (object value in propValues)
              {
                  IISOle.IISMimeType mimeType = (IISOle.IISMimeType)value;
      
                  if (extension == mimeType.Extension)
                  {
                      return mimeType.MimeType;
                  }
              }
      
              return null;
      
          }
      }
      

      在 COM 选项卡下添加对System.DirectoryServices 的引用和对Active DS IIS Namespace Provider 的引用。扩展需要有前导点,即.flv

      【讨论】:

      • 请注意,此代码在 IIS 7.5 中似乎不起作用,至少在使用默认配置时不起作用。在 IIS 6.0 中运行良好。
      • @Blinky - OP 询问了 IIS6(见标题),我没有提出任何关于这适用于 IIS7 的建议。 IIS7 != IIS6,它们是两个不同的 Web 服务器。如果安装了 IIS6 向后兼容位,它可能会起作用。但如果是,您不会在 IIS7 上这样做,您将使用托管 API 搜索 <mimeMap> 设置:iis.net/ConfigReference/system.webServer/staticContent/mimeMap
      【解决方案3】:

      这是另一个类似的实现,但不需要添加 COM 引用 - 它通过反射检索属性并将它们存储在 NameValueCollection 中以便于查找:

      using System.Collections.Specialized; //NameValueCollection
      using System.DirectoryServices; //DirectoryEntry, PropertyValueCollection
      using System.Reflection; //BindingFlags
      
      NameValueCollection map = new NameValueCollection();
      using (DirectoryEntry entry = new DirectoryEntry("IIS://localhost/MimeMap"))
      {
        PropertyValueCollection properties = entry.Properties["MimeMap"];
        Type t = properties[0].GetType();
      
        foreach (object property in properties)
        {
          BindingFlags f = BindingFlags.GetProperty;
          string ext = t.InvokeMember("Extension", f, null, property, null) as String;
          string mime = t.InvokeMember("MimeType", f, null, property, null) as String;
          map.Add(ext, mime);
        }
      }
      

      您可以非常轻松地缓存该查找表,然后在以后引用它:

      Response.ContentType = map[ext] ?? "binary/octet-stream";
      

      【讨论】:

      • 这似乎不适用于 IIS Express - 您将收到“System.Runtime.InteropServices.COMException (0x80070005):访问被拒绝。”当访问 entry.Properties["MimeMap"].
      猜你喜欢
      • 2010-10-02
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多