Pergunta

Eu quero encontrar o tipo de mime para uma determinada extensão de arquivo em um servidor web IIS ASP.NET a partir do código-behind arquivo.

i deseja pesquisar a mesma lista que o próprio servidor usa quando servindo-se de um arquivo. Isto significa que qualquer tipo mime um administrador de web-servidor tenha adicionado ao Mime Map será incluído.

i poderia cegamente usar

HKEY_CLASSES_ROOT\MIME\Database\Content Type

mas isso não é documentado como sendo a mesma lista IIS usa, nem é documentado onde o Mime Map é armazenado.

i poderia cegamente chamar FindMimeFromData , mas que não está documentada como sendo a mesma lista IIS usa, nem posso garantir que o IIS Mime Map também será devolvida a partir dessa chamada.

Foi útil?

Solução

Aqui está um que fiz anteriormente:

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;

    }
}

Adicione uma referência para System.DirectoryServices e uma referência para Active DS IIS Namespace Provider na guia COM. As necessidades de extensão para ter o ponto inicial, ou seja, .flv.

Outras dicas

Aqui está outra implementação semelhante, mas não necessita de adicionar a referência COM - ele recupera as propriedades por meio de reflexão vez e os armazena em um NameValueCollection para fácil pesquisa:

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);
  }
}

Você pode facilmente armazenar em cache que tabela de pesquisa, em seguida, fazer referência a ela mais tarde:

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

O IIS armazena as informações MIME em seu próprio banco de dados. Procurando por "MimeMap IIS" na Internet irá revelar como lê-lo ou até mesmo alterá-lo. Ver, por exemplo C # - Como exibir entradas MimeMap para o console de uma instância do IIS.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top