IIS: Как получить путь метабазы? - PullRequest
6 голосов
/ 27 апреля 2010

Я пытаюсь получить список типов пантомимы, известных серверу IIS (, который, как вы видите, был задан и отвечен мной 2 года назад ). Вставленный в копию ответ включает в себя:

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

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

GetObject("IIS://localhost/MimeMap") Блог Скотта Хансельмана

new DirectoryEntry("IIS://Localhost/MimeMap")) Переполнение стека

new DirectoryEntry("IIS://Localhost/MimeMap")) Переполнение стека

New DirectoryServices.DirectoryEntry("IIS://localhost/MimeMap") Отзывы о скорости


Вы поняли идею. Все согласны с тем, что вы используете магический путь iis: // localhost / mimemap . И это прекрасно работает, за исключением случаев, когда это не так.

Единственный ключ, который я могу найти, почему он терпит неудачу, от MVP IIS, блог Криса Кроу :

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

Здесь есть две подсказки:

  1. Он называет iis://localhost/mimemap Метабазный путь . Для меня это звучит так: « путь » к « метабазе ».
  2. Он говорит, что путь к метабазе может быть чем-то другим; и он приводит пример того, на что это может быть похоже.

Сейчас я и вся планета жестко кодируем " MetabasePath " как

iis://localhost/MimeMap

Что это должно быть на самом деле? Что должен делать код для создания допустимого MetabasePath?


Примечание: я не получаю ошибку об отказе в доступе, ошибка такая же, когда у вас неверный MetabasePath, например iis://localhost/SoTiredOfThis

Ответы [ 2 ]

6 голосов
/ 27 апреля 2010

Если вы работаете с конфигурацией IIS вашего локального компьютера, т.е. ваш код и IIS находятся в одном окне, то достаточно указать:

IIS://Localhost/mimemap

Часть IIS: на языке OLE также называется прозвищем.

Если вы откроете файл метабазы ​​IIS6 (C:\Windows\System32\inetsrv\metabase.xml), вы увидите большой «блоб» XML. На самом деле это уплощенная древовидная структура.

Пути в метабазе представлены Location атрибутами.

Имя IIS://localhost отображается на путь Location /LM, который фактически является корнем дерева.

Имя IIS://localhost/MimeMap отображается на путь Location /LM/MimeMap.

Если ваш код обращается к метабазе на удаленных машинах, тогда вместо указания IIS://localhost/[path] можно указать IIS://[RemoteMachineName]/[path]. Вот что означает комментарий Криса Кроуза.

IIS://localhost/MimeMap также является основным списком Mime Type. Все сайты наследуют этот список (метабаза IIS сильно зависит от унаследованных свойств).

Если вы хотите переопределить типы Mime для определенного сайта, измените:

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

Полезно открыть файл метабазы ​​IIS и покопаться, чтобы понять, что происходит под капотом.

Обновление:

Чтобы ответить на ваш вопрос о том, почему вы можете создать объект DirectoryEntry, путь которого неверен, DirectoryEntry - это объект-оболочка общего назначения, используемый для привязки к различным типам поставщиков ADSI, таким как IIS, LDAP и WinNT. Это позволяет создавать DirectoryEntry объектов, где не обязательно может быть соответствующий объект по указанному пути. Некоторые операции поставщика ADSI могут требовать этой возможности.

В DirectoryEntry есть статический метод, называемый Exists, который вы можете использовать для проверки существования объектов. Например:

// Does Default Website exist?
if(DirectoryEntry.Exists("IIS://localhost/w3svc/1"))
{
  // Do work...
}
0 голосов
/ 15 марта 2012

У меня возникла проблема с возвратом 0x80005000 при попытке сделать это. Глупой причиной моей проблемы было то, что я использовал IIS7 и не установил поддержку совместимости метабазы ​​IIS6.

...