IIS: Comment obtenir le chemin métabase?
-
01-10-2019 - |
Question
Je suis en train d'obtenir la liste des types MIME connus à un serveur IIS ( que vous pouvez voir et on m'a demandé et répondu par moi il y a 2 ans ). La réponse collée copie implique:
Vous avez l'idée. Tout le monde est d'accord que vous utilisez un chemin magique iis: // localhost / MimeMap . Et cela fonctionne très bien, sauf pour les moments où il ne fonctionne pas.
Le seul indice que je peux trouver la raison pour laquelle il échoue, est d'un IIS MVP, Chris Crowe, 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:
- He appels
iis://localhost/mimemap
Chemin de la métabase . Ce qui me semble qu'il est une sorte de " chemin " à un " métabase ". - Il dit que le chemin métabase pourrait être autre chose; et il donne un exemple de ce qu'il pourrait être.
En ce moment i, et la planète entière, sont hardcoding la " Metabasepath " comme
iis://localhost/MimeMap
Que faut-il vraiment? Qu'est-ce que le code devrait faire pour construire une Metabasepath valide?
Note: Je ne reçois pas une erreur de refus d'accès, l'erreur est la même lorsque vous avez un Metabasepath non valide, par exemple iis://localhost/SoTiredOfThis
La solution
Si vous travaillez avec IIS config de votre machine locale à savoir votre code et IIS sont sur la même case, puis il suffit d'indiquer:
IIS://Localhost/mimemap
La partie de IIS:
est également connu comme un surnom dans le langage OLE.
Si vous ouvrez le fichier métabase IIS6 (de C:\Windows\System32\inetsrv\metabase.xml
), vous trouverez un grand « blob » de XML. Ceci est en fait une aplatis structure arborescente.
Les chemins du métabase sont représentés par des attributs Location
.
Le sobriquet IIS://localhost
cartes sur le chemin de Location
/LM
qui est effectivement la racine de l'arbre.
Les cartes IIS://localhost/MimeMap
moniker au chemin de Location
/LM/MimeMap
.
Si votre code accède à la métabase sur des machines distantes alors au lieu de specifiying IIS://localhost/[path]
, on précise IIS://[RemoteMachineName]/[path]
. C'est ce que signifie de commentaire Chris Crowes.
IIS://localhost/MimeMap
est également le maître Mime liste type. Tous les sites hériteront de cette liste (la métabase IIS repose en grande partie sur les 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 IIS métabase 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 Windows NT. Il permet la création d'objets DirectoryEntry
où il peut ne pas être nécessairement un objet correspondant au chemin d'accès spécifié. Certaines opérations de fournisseur ADSI peut exiger cette capacité.
Il existe une méthode statique sur DirectoryEntry
appelé 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...
}
Autres conseils
J'avais un problème à obtenir 0x80005000 retourné en essayant de le faire. La cause stupide de mon problème était que j'utilisais IIS7 et n'avait pas installé le soutien de la compatibilité de métabase IIS6.