ASP.NET/IIS6: Come cercare nella mappa mime del server?
-
05-07-2019 - |
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.
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.