ASP.NET/IIS6: Comment rechercher la mime map du serveur?
-
05-07-2019 - |
Question
Je souhaite trouver le type mime d'une extension de fichier donnée sur un serveur Web IIS ASP.NET à partir du fichier code-behind.
Je souhaite rechercher la même liste que celle utilisée par le serveur lui-même lors de la diffusion d'un fichier. Cela signifie que tout type de mime ajouté par un administrateur de serveur Web à la Carte Mime sera inclus.
je pourrais utiliser aveuglément
HKEY_CLASSES_ROOT\MIME\Database\Content Type
mais cela n'est pas documenté comme étant la même liste qu'IIS utilise, ni où se trouve la carte Mime .
Je pourrais appeler aveuglément FindMimeFromData , mais cela n'est pas documenté comme étant la même liste qu'IIS utilise, et je ne peux pas garantir que la Mime Map d'IIS sera également renvoyée à partir de cet appel.
La solution
En voici un que j'ai fait précédemment:
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;
}
}
Ajoutez une référence à System.DirectoryServices
et une référence à Fournisseur d'espace de noms IIS DS actif
sous l'onglet COM. L’extension doit comporter le point principal, à savoir .flv
.
Autres conseils
Voici une autre implémentation similaire, mais ne nécessitant pas l'ajout de la référence COM, elle récupère les propriétés par réflexion et les stocke dans une NameValueCollection pour une recherche facile:
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);
}
}
Vous pouvez très facilement mettre en cache cette table de recherche, puis la référencer ultérieurement:
Response.ContentType = map[ext] ?? "binary/octet-stream";
IIS stocke les informations MIME dans sa propre base de données. Recherche de " MimeMap IIS " sur Internet vous montrera comment le lire ou même le changer. Voir, par exemple, C # - Comment afficher les entrées MimeMap sur la console depuis une instance d'IIS.