Domanda

Voglio trovare il tipo mime per una determinata estensione di file su un server Web ASP.NET IIS dal file code-behind.

Voglio cercare la stessa lista che il server stesso usa quando serve un file. Ciò significa che verranno inclusi tutti i tipi di mime aggiunti da un amministratore del web server alla Mappa Mime .

potrei usare ciecamente

HKEY_CLASSES_ROOT\MIME\Database\Content Type

ma che non è documentato come lo stesso elenco utilizzato da IIS, né documentato dove è archiviata la Mappa Mime .

Potrei chiamare ciecamente FindMimeFromData , ma che non è documentato come lo stesso elenco utilizzato da IIS, né posso garantire che anche la Mime Map di IIS verrà restituita da quella chiamata.

È stato utile?

Soluzione

Eccone uno che ho fatto in precedenza:

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;

    }
}

Aggiungi un riferimento a System.DirectoryServices e un riferimento a Provider di spazi dei nomi IIS DS attivo nella scheda COM. L'estensione deve avere il punto iniziale, ovvero .flv .

Altri suggerimenti

Ecco un'altra implementazione simile, ma non richiede l'aggiunta del riferimento COM: recupera invece le proprietà tramite reflection e le memorizza in un NameValueCollection per una facile ricerca:

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

Puoi facilmente memorizzare nella cache quella tabella di ricerca e quindi fare riferimento in un secondo momento:

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

IIS archivia le informazioni MIME nel proprio database. Ricerca di " MimeMap IIS " su Internet rivelerà come leggerlo o addirittura modificarlo. Vedi ad esempio C # - Come visualizzare le voci MimeMap sulla console da un'istanza di IIS.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top