2008-10-06 17 views
11

quiero encontrar el tipo mime para una extensión de archivo dada en un servidor web IIS ASP.NET del archivo de código subyacente.ASP.NET/IIS6: ¿Cómo buscar en el mapa mime del servidor?

quiero buscar en la misma lista que el servidor en sí cuando se sirve un archivo. Esto significa que se incluirá cualquier tipo de mimo que un administrador de servidor web haya agregado al Mime Map.

que podría utilizar ciegamente

HKEY_CLASSES_ROOT\MIME\Database\Content Type 

pero que no está documentado como siendo la misma lista IIS utiliza, ni está documentado donde se almacena el Mime Mapa.

i ciegamente podría llamar FindMimeFromData, pero que no está documentado como siendo la misma lista IIS utiliza, ni puedo garantizar que el IIS Mime Mapa también se volvió de esa llamada.

Respuesta

10

Aquí hay una que hice 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; 

    } 
} 

agregar una referencia a System.DirectoryServices y una referencia a Active DS IIS Namespace Provider bajo la ficha COM. La extensión debe tener el punto inicial, es decir, .flv.

+0

Tenga en cuenta que este código no parece funcionar en IIS 7.5, al menos no cuando se usa la configuración predeterminada. Funciona bien en IIS 6.0. –

+0

@Blinky - OP preguntó acerca de IIS6 (ver el título) y no hice ninguna sugerencia de que esto funcionaría en IIS7. IIS7! = IIS6, son dos servidores web diferentes. Podría funcionar si los bits de compatibilidad con versiones anteriores de IIS6 están instalados. Pero no lo haría de esta manera en IIS7 si lo fueran, buscaría la configuración '' utilizando la API administrada: http://www.iis.net/ConfigReference/system.webServer/staticContent/mimeMap – Kev

12

Aquí es otra aplicación similar, pero no requiere la adición de la referencia COM - que recupera las propiedades a través de la reflexión en su lugar y los almacena en una NameValueCollection para facilitar las operaciones de 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); 
    } 
} 

Usted puede muy fácilmente caché que tabla de búsqueda, y luego consultar más adelante:

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

This no parece funcionar con IIS Express: obtendrá una "System.Runtime.InteropServices.COMException (0x80070005): acceso denegado". al acceder a entry.Properties ["MimeMap"]. –

Cuestiones relacionadas