ASP.NET/IIS6: Как выполнить поиск на карте MIME на сервере? - PullRequest
11 голосов
/ 06 октября 2008

Я хочу найти mime-тип для данного расширения файла на веб-сервере IIS ASP.NET из файла с выделенным кодом.

Я хочу найти тот же список, который сам сервер использует при обслуживании файла. Это означает, что будут включены любые типы пантомимы, добавленные администратором веб-сервера в Карта пантомимы .

я мог бы слепо использовать

HKEY_CLASSES_ROOT\MIME\Database\Content Type

, но это не задокументировано как тот же список, который использует IIS, и не задокументировано, где хранится Mime Map .

Я мог бы слепо вызвать FindMimeFromData , но это не зарегистрировано как тот же список, который использует IIS, и я не могу гарантировать, что IIS Mime Map также будет возвращена звоните.

Ответы [ 3 ]

12 голосов
/ 11 февраля 2010

Вот еще одна похожая реализация, но не требует добавления ссылки 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";
10 голосов
/ 06 октября 2008

Вот тот, который я сделал ранее:

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;

    }
}

Добавить ссылку на System.DirectoryServices и ссылку на Active DS IIS Namespace Provider на вкладке COM. Расширение должно иметь начальную точку, т.е. .flv.

1 голос
/ 06 октября 2008

IIS сохраняет информацию MIME в своей собственной базе данных. Поиск "MimeMap IIS" в Интернете покажет, как его читать или даже изменять. См., Например, C # - Как отобразить записи MimeMap на консоли из экземпляра IIS.

...