2008-10-06 11 views
11

Chcę znaleźć typ mime dla danego rozszerzenia pliku na serwerze sieci Web ASP.NET IIS z pliku kodu źródłowego.ASP.NET/IIS6: Jak przeszukiwać mapę mime serwera?

Chcę przeszukać tę samą listę, której sam serwer używa podczas podawania pliku. Oznacza to, że każdy typ MIME, który został dodany przez administratora serwera WWW do , zostanie dołączona mapa MIME.

mogę ślepo użyć

HKEY_CLASSES_ROOT\MIME\Database\Content Type 

ale to nie jest udokumentowana, jako ta sama lista IIS zastosowań, ani nie jest to udokumentowane, gdzie Mime Mapa jest przechowywany.

mogę zadzwonić FindMimeFromData ślepo, ale to nie jest udokumentowana, jako ta sama lista IIS zastosowań, ani mogę zagwarantować, że IIS Mime Mapa będą również wrócił z tej rozmowy.

Odpowiedz

10

Oto jeden zrobiłem wcześniej:

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; 

    } 
} 

Dodaj odwołanie do System.DirectoryServices i odniesienie do Active DS IIS Namespace Provider w zakładce COM. Rozszerzenie musi mieć wiodącą kropkę, tj. .flv.

+0

Należy zauważyć, że ten kod nie działa w IIS 7.5, a przynajmniej nie w konfiguracji domyślnej. Działa dobrze w IIS 6.0. –

+0

@Blinky - OP zapytał o IIS6 (patrz tytuł) i nie sugerowałem, że to zadziała na IIS7. IIS7! = IIS6, są to dwa różne serwery WWW. Może działać, jeśli bity zgodności wstecznej IIS6 są zainstalowane. Ale nie zrobiłbyś tego w ten sposób na IIS7, gdyby tak było, możesz przeszukać ustawienie '' używając zarządzanego API: http://www.iis.net/ConfigReference/system.webServer/staticContent/mimeMap – Kev

12

Oto kolejna podobna realizacja, ale nie wymaga dodawania odwołanie COM - pobiera właściwości poprzez odbicie zamiast i przechowuje je w NameValueCollection dla łatwego odnośnika:

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

Można bardzo łatwo cache że przeglądaj tabelę, a następnie odwołaj się do niej później:

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

nie działa z IIS Express - dostaniesz "System.Runtime.InteropServices.COMException (0x80070005): Odmowa dostępu." przy dostępie do wpisu. Właściwości ["MimeMap"]. –

Powiązane problemy