IIS: Как получить метабазный путь?
-
01-10-2019 - |
Вопрос
Я пытаюсь получить список типов MIME, известных на 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. Отказ И это работает отлично, кроме времени, когда это не так.
Единственная подсказка, которую я могу найти, как это терпеет неудачу, от IIS MVP, Крис Кроу, блог:
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);
Здесь здесь два подсказки:
- Он звонит
iis://localhost/mimemap
то Путь метабазы. Отказ Что звучит мне, как будто это какой-то «дорожка«До»метабаза". - Он говорит, что дорожка к тому метабаза может быть что-то еще; И он придает пример того, что это может быть похоже.
Прямо сейчас я, и вся планета, жесткодируя "Метабаспат" так как
iis://localhost/MimeMap
Что это должно быть действительно? Что должен делать код для построения действительного метабасепата?
ПРИМЕЧАНИЕ. Я не получающую доступ отказанной ошибки, ошибка одинакова, когда у вас есть недопустимый MetabasePath, например, iis://localhost/SoTiredOfThis
Решение
Если вы работаете с конфигурацией IIS вашей локальной машины, т.е. ваш код и IIS находятся в одном коробке, то это достаточно указать:
IIS://Localhost/mimemap
То IIS:
Часть также известна как моникер в олем.
Если вы откроете файл Metabase IIS6 (C:\Windows\System32\inetsrv\metabase.xml
) Вы найдете большой «BLOB» XML. Это на самом деле сплющенная древесная структура.
Пути в метабазе представлены Location
атрибуты.
Моникер IIS://localhost
Карты к тому Location
дорожка /LM
который эффективно является корнем дерева.
Моникер IIS://localhost/MimeMap
Карты к тому Location
дорожка /LM/MimeMap
.
Если ваш код доступа к метабазе на удаленных машинах, то вместо Specifiying IIS://localhost/[path]
, один бы уточнил IIS://[RemoteMachineName]/[path]
. Отказ Это то, что означает комментарий Криса Кроуса.
IIS://localhost/MimeMap
Также является списком типового типа MIME. Все сайты наследуют этот список (метабаза IIS сильно зависит от унаследованных свойств).
Если вы хотите переопределить типы MIME для определенного сайта, то вы можете изменить:
IIS://localhost/W3SVC/[iisnumber]/ROOT/MimeMap
Полезно открыть файл IIS Metabase и выкопать, чтобы понять, что происходит под капотом.
Обновлять:
Ответить на ваш вопрос о том, почему вы можете создать DirectoryEntry
объект, где путь недействителен, DirectoryEntry
Это объект обертки общего назначения, используемый для привязки к различным типам поставщиков ADSI, таких как IIS, LDAP и Winnt. Это позволяет создавать DirectoryEntry
Объекты, где не обязательно может быть соответствующий объект на указанном пути. Некоторые операции поставщика ADSI могут потребовать этой возможности.
Есть статический метод на DirectoryEntry
называется Exists
что вы можете использовать для проверки наличия объектов. Например:
// Does Default Website exist?
if(DirectoryEntry.Exists("IIS://localhost/w3svc/1"))
{
// Do work...
}
Другие советы
У меня возникла проблема с возвращением 0x80005000 при попытке сделать это. Глуповая причина моей проблемы заключалась в том, что я использовал IIS7 и не установил поддержку совместимости Metabase IIS6.