ASP.NET/IIS6: ¿Cómo buscar el mapa mime del servidor?
-
05-07-2019 - |
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.
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.