2010-04-26 25 views
5

estoy tratando de obtener la lista de tipos de mime conocidos por un servidor IIS (which you can see was asked and and answered by me 2 years ago). La respuesta de copia pegada implica:IIS: ¿cómo obtener la ruta de metabase?

GetObject("IIS://LocalHost/MimeMap")msdn

GetObject("IIS://localhost/mimemap")KB246068

GetObject("IIS://localhost/MimeMap")Scott Hanselman's Blog

new DirectoryEntry("IIS://Localhost/MimeMap"))Stack Overflow

new DirectoryEntry("IIS://Localhost/MimeMap"))Stack Overflow

New DirectoryServices.DirectoryEntry("IIS://localhost/MimeMap")Velocity Reviews


se entiende la idea. Todos están de acuerdo en que utilizas una ruta mágica iis: // localhost/mimemap. Y esto funciona muy bien, excepto en los momentos en que no funciona.

La única pista que puedo encontrar en cuanto a por qué no funciona, is from an IIS MVP, Chris Crowe's, blog:

string ServerName = "LocalHost"; 
string MetabasePath = "IIS://" + ServerName + "/MimeMap"; 
    // Note: This could also be something like 
    // string MetabasePath = "IIS://" + ServerName + "/w3svc/1/root"; 

DirectoryEntry MimeMap = new DirectoryEntry(MetabasePath); 

Hay dos pistas aquí:

  1. iis://localhost/mimemap él llama la Ruta de la metabase . Lo cual me parece que es una especie de "ruta" a una "metabase metabase".
  2. Dice que la ruta a metabase podría ser otra cosa; y él da un ejemplo de cómo podría ser.

Ahora mismo, y todo el planeta, están codificando el "Metabasepath" como

iis://localhost/MimeMap 

Lo que debería ser realmente? ¿Qué debería hacer el código para construir un MetabasePath válido?


Nota: Hasta ahora no recibo un error de acceso denegado, el error es el mismo cuando se tiene una Metabasepath no válido, por ejemplo, iis://localhost/SoTiredOfThis

+0

No está claro a partir de la pregunta, ¿recibe una excepción de seguridad? – Kev

+0

No es una excepción de seguridad. La llamada a 'DirectoryEntry (MetabasePath)' regresa bien y devuelve un objeto. El error viene después cuando intenta acceder a cualquiera de las propiedades devueltas del objeto 'DirectoryEntry'. Todos dan un error COM "no especificado". Esto sucede cuando la ruta no es válida, p. "' iis: // localhost/asdfadsf' " –

+0

@Ian - mira la actualización de mi respuesta. – Kev

Respuesta

5

Si está trabajando con la configuración de IIS de su equipo local es decir, su código e IIS están en la misma caja, entonces es suficiente para especificar:

IIS://Localhost/mimemap

La parte IIS: es también conocido como un apodo en el lenguaje OLE.

Si abre el archivo de la metabase IIS6 (C:\Windows\System32\inetsrv\metabase.xml) encontrará un gran 'blob' de XML. Esta es, de hecho, una estructura de árbol aplanada.

Las rutas en la metabase están representadas por los atributos Location.

El moniker IIS://localhost se mapea en la ruta Location/LM que es efectivamente la raíz del árbol.

El apodo IIS://localhost/MimeMap se correlaciona con el Location ruta /LM/MimeMap.

Si su código está accediendo a la metabase en máquinas remotas, en lugar de especificar IIS://localhost/[path], se especificará IIS://[RemoteMachineName]/[path]. Esto es lo que Chris Crowes comenta.

IIS://localhost/MimeMap es también la lista maestra Tipo de MIME. Todos los sitios heredan esta lista (la metabase de IIS depende en gran medida de las propiedades heredadas).

Si quisiera anular los tipos MIME de un sitio específico entonces sería modificar:

IIS://localhost/W3SVC/[iisnumber]/ROOT/MimeMap

Es útil para abrir el archivo de la metabase de IIS y tienen una excavación en torno a entender lo que está pasando bajo el capó.

Actualización:

Para responder a su pregunta de por qué se puede crear un objeto DirectoryEntry donde la ruta no es válida, DirectoryEntry es un objeto contenedor de propósito general usado para unirse contra diferentes tipos de proveedores de ADSI como IIS, LDAP y WinNT. Permite la creación de objetos DirectoryEntry donde no necesariamente puede haber un objeto coincidente en la ruta especificada. Algunas operaciones del proveedor ADSI pueden requerir esta capacidad.

Hay un método estático en DirectoryEntry llamada Exists que se puede utilizar para probar la existencia de los objetos. Por ejemplo:

// Does Default Website exist? 
if(DirectoryEntry.Exists("IIS://localhost/w3svc/1")) 
{ 
    // Do work... 
} 
+0

+1 por completo, informativo, y aparentemente como si supieras de lo que estás hablando. Tendré que contactarme con el desarrollador que realmente estaba experimentando los problemas (en dos máquinas) para ver si podemos poner en práctica lo que he aprendido aquí para resolver el problema (y finalmente aceptar la respuesta) –

+0

@Ian - gracias :) - Uno de mis personajes de un solo truco es escribir sistemas de administración y aprovisionamiento de IIS 5/6/7, por lo que he estado inmerso en la alquimia de metabase desde hace unos años. – Kev

+0

@Ian - ¿Alguna de esta ayuda? – Kev

0

Estaba teniendo un problema al devolver 0x80005000 al intentar hacer esto. La estúpida causa de mi problema fue que estaba usando IIS7 y no había instalado el soporte de compatibilidad de metabase IIS6.

Cuestiones relacionadas