Я спросил об этом в 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, потому что тема затрагивала оба сайта. Вот ответ, который я получил: