2010-04-26 22 views
5

J'essaie d'obtenir la liste des types MIME connus d'un serveur IIS (which you can see was asked and and answered by me 2 years ago). La réponse collée copie implique:IIS: Comment obtenir le chemin de la métabase?

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


Vous avez l'idée. Tout le monde convient que vous utilisez un chemin magique iis: // localhost/mimemap. Et cela fonctionne très bien, sauf pour les moments où ce n'est pas le cas.

Le seul indice que je peux trouver la raison pour laquelle il échoue, 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); 

Il y a deux indices ici:

  1. Il appelle iis://localhost/mimemap le Chemin de la métabase. Ce qui me semble être une sorte de "chemin" vers une "métabase". Il dit que le chemin à la métabase pourrait être quelque chose d'autre; et il donne un exemple de ce que cela pourrait être.

i En ce moment, et la planète entière, sont hardcoding la "Metabasepath" comme

iis://localhost/MimeMap 

Que faut-il vraiment? Que devrait faire le code pour construire un MetabasePath valide?


Note: Je ne reçois pas une erreur d'accès refusé, l'erreur est la même lorsque vous avez un Metabasepath non valide, par exemple iis://localhost/SoTiredOfThis

+0

La question ne vous permet pas de savoir si une exception de sécurité est levée? – Kev

+0

Ce n'est pas une exception de sécurité. L'appel à 'DirectoryEntry (MetabasePath)' renvoie bien, et il renvoie un objet. L'erreur survient lorsque vous essayez d'accéder à l'une des propriétés de l'objet DirectoryEntry renvoyé. Ils donnent tous une erreur COM "non spécifiée". Cela se produit lorsque le chemin n'est pas valide, par ex. "' iis: // localhost/asdfadsf' " –

+0

@Ian - voir la mise à jour de ma réponse. – Kev

Répondre

5

Si vous travaillez avec la configuration IIS de votre machine locale par exemple votre code et IIS sont sur la même case, puis il suffit d'indiquer:

IIS://Localhost/mimemap

La partie IIS: est également connu sous le nom un surnom dans le langage OLE.

Si vous ouvrez le fichier de métabase IIS6 (C:\Windows\System32\inetsrv\metabase.xml), vous trouverez un grand 'blob' de XML. C'est en fait une structure arborescente aplatie.

Les chemins de la métabase sont représentés par Location attributs.

Le surnom IIS://localhost correspond au chemin Location/LM qui est effectivement la racine de l'arborescence.

Le surnom IIS://localhost/MimeMap correspond au chemin Location/LM/MimeMap.

Si votre code accède à la métabase sur des machines distantes, au lieu de spécifier IIS://localhost/[path], vous devez spécifier IIS://[RemoteMachineName]/[path]. C'est ce que commente Chris Crowes.

IIS://localhost/MimeMap est également la liste principale Mime Type. Tous les sites héritent de cette liste (la métabase IIS dépend fortement des propriétés héritées).

Si vous voulez remplacer les types Mime pour un site spécifique, vous souhaitez modifier:

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

Il est utile d'ouvrir le fichier métabase IIS et une fouille autour de comprendre ce qui se passe sous le capot.

Mise à jour:

Pour répondre à votre question de savoir pourquoi vous pouvez créer un objet DirectoryEntry où le chemin est invalide, DirectoryEntry est un objet d'emballage à usage général utilisé pour lier contre différents types de fournisseurs ADSI tels que IIS, LDAP et WinNT. Il permet la création de DirectoryEntry objets où il n'y a pas nécessairement un objet correspondant au chemin spécifié. Certaines opérations du fournisseur ADSI peuvent nécessiter cette fonctionnalité.

Il existe une méthode statique sur DirectoryEntry appelée Exists que vous pouvez utiliser pour tester l'existence d'objets. Par exemple:

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

+1 pour approfondi, instructif, et apparemment vous savez de quoi vous parlez. Je vais devoir obtenir avec le développeur qui connaissait réellement les problèmes (sur deux machines) pour voir si nous pouvons mettre ce que j'ai appris ici à utiliser pour résoudre le problème (et enfin accepter la réponse) –

+0

@Ian - merci :) - Un de mes one-trick-pony écrit des systèmes de provisioning et de gestion IIS 5/6/7, donc j'ai été immergé dans l'alchimie de la métabase pendant quelques années maintenant. – Kev

+0

@Ian - avez-vous aidé? – Kev

0

J'ai rencontré un problème lors de l'obtention de 0x80005000 lorsque vous essayez de le faire. La cause stupide de mon problème était que j'utilisais IIS7 et que je n'avais pas installé le support de compatibilité de métabase IIS6.