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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top