Когда вы добавляете «карту сценариев» с использованием битов совместимости ADSI (для удобства используйте веб-сайт по умолчанию), это добавляет сопоставление обработчика в файл applicationHost.config
для сайта по адресу:
<location path="Default Web Site">
<system.webServer>
<handlers>
<add name="AboMapperCustom-12345678" ... />
</handlers>
</system>
</location>
При удалении сопоставления обработчика в диспетчере IIS7 вместо удаления сопоставления из файла applicationHost.config
и раздела, показанного выше, в корневой каталог сайта добавляется файл web.config
со следующим текстом:
<configuration>
<system.webServer>
<handlers>
<remove name="AboMapperCustom-12345678" />
</handlers>
</system>
</configuration>
При получении конфигурации для веб-сайта с использованием нового управляемого Microsoft.Web.Administration
.NET API вы можете прочитать конфигурацию на разных уровнях, например:
1: считывание конфигурации на уровне applicationHost.config
или APPHOST
ServerManager serverManager = new ServerManager();
var site = serverManager.Sites.Where(s => s.Id == 1).SingleOrDefault();
Configuration siteConfig = serverManager.GetApplicationHostConfiguration();
ConfigurationSection handlersSection =
siteConfig.GetSection("system.webServer/handlers", site.Name);
ConfigurationElementCollection handlersCollection =
handlersSection.GetCollection();
foreach (var item in handlersCollection)
{
Console.WriteLine(item.Attributes["name"].Value);
}
В приведенном выше примере, даже если вы удалили отображение, оно все равно будет отображаться при итерации коллекции отображений обработчика. Это потому, что вы запросили конфигурацию на уровне хоста приложения. Любые файлы web.config
, которые существуют в корне сайта или ниже, не будут прочитаны, а их директивы обработчиков <add/>
и <remove/>
не будут включены.
2: Вы можете прочитать конфигурацию, относящуюся к сайту (или подпапке на сайте):
ServerManager serverManager = new ServerManager();
Configuration siteConfig = serverManager.GetWebConfiguration("Default Web Site");
ConfigurationSection handlersSection =
siteConfig.GetSection("system.webServer/handlers");
ConfigurationElementCollection handlersCollection =
handlersSection.GetCollection();
foreach (var item in handlersCollection)
{
Console.WriteLine(item.Attributes["name"].Value);
}
Также будет прочитан файл сайта web.config
и будет возвращен список сопоставления обработчиков, который учитывает директивы <add/>
и <remove/>
, указанные в web.config
.
.
Это то, что делает приложение IIS7 Manager, когда вы просматриваете и изменяете сопоставления обработчиков. Это добавление и удаление обработчиков путем создания (при необходимости) файла web.config
в корневой папке сайта (или подпапках) и добавления реквизитов <add/>
и <remove/>
на этом уровне.
Похоже, что уровень совместимости IIS6 работает исключительно на уровне applicationHost.config
APPHOST (вариант 1 выше), поэтому вы видите эти различия.
Это ошибка? Я не уверен, что это потому, что в конечном итоге ADSI никогда не был web.config
в первую очередь. Кроме того, MS придется добавить новый метод или флаг, чтобы позволить вам указать, на каком уровне вы действительно хотите внести эти «сценарии», и это может означать взлом и тестирование компонентов ADSI, что, в свою очередь, может привести к ошибкам. Это поведение имитирует модификацию старой метабазы IIS6, и applicationHost.config
фактически аналогичен метабазе, так что вы можете утверждать, правильно или неправильно, что он поступает правильно.