Pregunta

quiero encontrar el tipo mime para una extensión de archivo dada en un servidor web IIS ASP.NET desde el archivo de código subyacente.

quiero buscar la misma lista que usa el servidor cuando sirve un archivo. Esto significa que se incluirá cualquier tipo de mime que un administrador de servidor web haya agregado al Mapa Mime .

podría usar a ciegas

HKEY_CLASSES_ROOT\MIME\Database\Content Type

pero eso no está documentado como la misma lista que usa IIS, ni está documentado donde se almacena Mime Map .

podría llamar ciegamente a FindMimeFromData , pero eso no está documentado como la misma lista que usa IIS, ni puedo garantizar que el Mime Map de IIS también se devolverá de esa llamada.

¿Fue útil?

Solución

Aquí hay uno que hice antes:

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;

    }
}

Agregue una referencia a System.DirectoryServices y una referencia a Active DS IIS Namespace Provider en la pestaña COM. La extensión debe tener el punto inicial, es decir, .flv .

Otros consejos

Aquí hay otra implementación similar, pero no requiere agregar la referencia de COM, sino que recupera las propiedades a través de la reflexión y las almacena en NameValueCollection para una fácil búsqueda:

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

Es muy fácil almacenar en la memoria caché esa tabla de búsqueda y luego consultarla más adelante:

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

IIS almacena la información MIME en su propia base de datos. Buscando " MimeMap IIS " En Internet se revelará cómo leerlo o incluso cambiarlo. Vea, por ejemplo, C #: cómo mostrar las entradas de MimeMap en la consola desde una instancia de IIS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top