Pregunta

Estoy tratando de obtener la lista de tipos MIME conocidos a un servidor IIS ( que se puede ver y se le preguntó y respondió por mí hace 2 años ). La respuesta de copia pegado consiste en:

GetObject("IIS://LocalHost/MimeMap") href="http://msdn.microsoft.com/en-us/library/ms752346.aspx" rel="nofollow noreferrer"> MSDN

GetObject("IIS://localhost/mimemap") href="http://support.microsoft.com/kb/246068" rel="nofollow noreferrer"> KB246068

GetObject("IIS://localhost/MimeMap") href="http://www.hanselman.com/blog/ProgrammaticallyAddingMimeTypesToIIS.aspx" rel="nofollow noreferrer"> Blog de Scott Hanselman

new DirectoryEntry("IIS://Localhost/MimeMap")) href="https://stackoverflow.com/questions/174888/asp-net-iis6-how-to-search-the-servers-mime-map"> desbordamiento de pila

new DirectoryEntry("IIS://Localhost/MimeMap")) href="https://stackoverflow.com/questions/234526/can-i-setup-an-iis-mime-type-in-net"> desbordamiento de pila

New DirectoryServices.DirectoryEntry("IIS://localhost/MimeMap") href="http://www.velocityreviews.com/forums/t83319-querying-iismimemap-access-is-denied-help.html" rel="nofollow noreferrer"> Velocidad Comentarios


Usted consigue la idea. Todo el mundo está de acuerdo en que se utiliza un camino mágico IIS: // localhost / MimeMap . Y esto funciona muy bien, a excepción de los momentos en que no lo hace.

La única pista que puedo encontrar por qué se produce un error, es de un MVP de IIS, Chris Crowe, el 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. El llama iis://localhost/mimemap la Ruta de la metabase . ¿Qué me suena como que es una especie de " ruta " a un " metabase ".
  2. Se dice que el ruta a metabase podría ser otra cosa; y da un ejemplo de lo que pudiera ser así.

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

iis://localhost/MimeMap

Lo que debería ser realmente? Lo que debería estar haciendo el código para construir un Metabasepath válida?


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

¿Fue útil?

Solución

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

IIS://Localhost/mimemap

La porción IIS: también se conoce como un moniker OLE en el lenguaje.

Si abre el archivo de la metabase IIS 6 (C:\Windows\System32\inetsrv\metabase.xml) encontrará una gran 'burbuja' del XML. Esta es de hecho una aplanada estructura de árbol.

Caminos en la metabase están representados por atributos Location.

El apodo IIS://localhost asigna a la ruta Location /LM que es efectivamente la raíz del árbol.

El apodo IIS://localhost/MimeMap asigna a la ruta Location /LM/MimeMap.

Si su código tiene acceso a la metabase en las máquinas remotas a continuación, en lugar de specifiying IIS://localhost/[path], se podría especificar IIS://[RemoteMachineName]/[path]. Esto es lo que significa el comentario Chris Crowes.

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

Si quieres 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 acerca de por qué se puede crear un objeto DirectoryEntry donde la ruta no es válida, DirectoryEntry es un objeto de uso general envoltorio utilizado para enlazar con tipos diferentes de proveedores ADSI como IIS, LDAP y WinNT. Permite la creación de objetos DirectoryEntry en los que puede no ser necesariamente un objeto coincidente en la ruta especificada. Algunas operaciones pueden requerir proveedor ADSI 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...
}

Otros consejos

Yo estaba teniendo un problema con conseguir 0x80005000 devueltos cuando se trata de hacer esto. La causa estúpida de mi problema era que yo estaba usando IIS7 y no había instalado el soporte de compatibilidad de metabase de IIS 6.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top