11

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

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

我可以盲目使用

HKEY_CLASSES_ROOT\MIME\Database\Content Type

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

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

4

3 回答 3

12

这是另一个类似的实现,但不需要添加 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";
于 2010-02-10T22:28:28.390 回答
10

这是我之前做的一个:

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.

于 2008-10-06T16:17:22.940 回答
1

IIS 将 MIME 信息存储在它自己的数据库中。在互联网上搜索“MimeMap IIS”将揭示如何阅读甚至更改它。例如,请参阅C# - 如何从 IIS 实例向控制台显示 MimeMap 条目。

于 2008-10-06T16:14:08.673 回答