Вопрос

Я пытаюсь получить список типов 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);

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

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

Прямо сейчас я, и вся планета, жесткодируя "Метабаспат" так как

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top