Назад | Перейти на главную страницу

Как мне аккуратно управлять сопоставлениями обработчиков в IIS7 с помощью пространства имен Microsoft.Web.Administration?

Я спросил об этом в Stack Overflow, но, возможно, опытный администратор IIS 7 знает об этом больше, поэтому я спрашиваю и здесь.

При манипулировании сопоставлениями обработчиков с помощью Microsoft.Web.Administration пространство имен, есть ли способ удалить <remove name="handler name"> тег добавлен на уровне сайта.

Например, у меня есть сайт, который наследует все сопоставления обработчиков из конфигурации глобальных сопоставлений обработчиков. В applicationHost.config в <location> изначально выглядит так:

<location path="60030 - testsite-60030.com">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication userName="" />
      </authentication>
    </security>
  </system.webServer>
</location>

Чтобы удалить обработчик, я использую такой код:

string siteName = "60030 - testsite-60030.com";
string handlerToRemove = "ASPClassic";

using(ServerManager sm = new ServerManager())
{
  Configuration siteConfig = 
    serverManager.GetApplicationHostConfiguration();
  ConfigurationSection handlersSection = 
    siteConfig.GetSection("system.webServer/handlers", siteName);
  ConfigurationElementCollection handlersCollection = 
    handlersSection.GetCollection();

  ConfigurationElement handlerElement = handlersCollection
    .Where(h => h["name"].Equals(handlerMapping.Name)).Single();

  handlersCollection.Remove(handlerElement);
}

Эквивалент APPCMD инструкция будет:

appcmd set config "60030 - autotest-60030.com" -section:system.webServer/handlers /-[name='ASPClassic'] /commit:apphost

Это приводит к тому, что сайт <location> тег выглядит так:

<location path="60030 - testsite-60030.com">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication userName="" />
      </authentication>
    </security>    
    <handlers>
      <remove name="ASPClassic" />
    </handlers>
  </system.webServer>
</location>

Все идет нормально. Однако, если я снова добавлю ASPClassic обработчик это приводит к:

<location path="60030 - testsite-60030.com">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication userName="" />
      </authentication>
    </security>    
    <handlers>
      <!-- Why doesn't <remove> get removed instead of tacking on 
           an <add> directive? -->
      <remove name="ASPClassic" />
      <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
    </handlers>
  </system.webServer>
</location>

Это происходит при использовании обоих Microsoft.Web.Administration пространство имен и C # или используя следующие APPCMD команда:

appcmd set config "60030 - autotest-60030.com" -section:system.webServer/handlers /+[name='ASPClassic',path='*.asp',verb=;'GET,HEAD,POST',modules='IsapiModule',scriptProcessor='%windir%\system32\inetsrv\asp.dll',resourceType='File'] /commit:apphost

Со временем это может привести к большим беспорядкам для каждого веб-сайта, обработчик которого был удален, а затем снова добавлен программно. Есть ли способ просто удалить <remove name="ASPClassic" /> тег, используя код пространства имен Microsoft.Web.Administration или APPCMD?

Если вы добавите или удалите сопоставление / модуль обработчика вручную на определенном сайте / приложении / virdir, вы получите <remove /> тег добавлен. Теперь, если вы снова добавите его вручную, <remove /> не пойдет, потому что что касается IIS, это означает, что вы внесли некоторые изменения в конфигурацию. Таким образом, вы получаете гибкость для добавления собственного настраиваемого сопоставления или модуля, переопределяющего глобальные модули / сопоставления.

Да, это создаст много беспорядка, но именно так с этим справились ... по крайней мере, пока. Один из способов справиться с этим - щелкнуть «Вернуться к родительскому» на панели «Действия».

Я также спросил об этом на Stack Overflow, потому что тема затрагивала оба сайта. Вот ответ, который я получил:

Как мне аккуратно управлять сопоставлениями обработчиков в IIS7 с помощью пространства имен Microsoft.Web.Administration?