Também perguntei sobre isso no Stack Overflow porque o assunto abrangia os dois sites. Esta é a resposta que recebi:
Eu perguntei sobre isso no Stack Overflow, mas talvez seja algo que um administrador experiente do IIS 7 possa saber mais, então estou perguntando aqui também.
Ao manipular Mapeamentos do Manipulador usando o namespace Microsoft.Web.Administration
, existe uma maneira de remover a tag <remove name="handler name">
adicionada no nível do site.
Por exemplo, eu tenho um site que herda todos os mapeamentos de manipulador da configuração de mapeamentos de manipulador global. Em applicationHost.config
, a tag <location>
inicialmente se parece com isso:
<location path="60030 - testsite-60030.com">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication userName="" />
</authentication>
</security>
</system.webServer>
</location>
Para remover um manipulador eu uso um código parecido com isto:
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);
}
A instrução APPCMD
equivalente seria:
appcmd set config "60030 - autotest-60030.com" -section:system.webServer/handlers /-[name='ASPClassic'] /commit:apphost
Isso resulta na tag <location>
do site da seguinte forma:
<location path="60030 - testsite-60030.com">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication userName="" />
</authentication>
</security>
<handlers>
<remove name="ASPClassic" />
</handlers>
</system.webServer>
</location>
Até aí tudo bem. No entanto, se eu adicionar novamente o manipulador ASPClassic
, isso resultará em:
<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>
Isso acontece ao usar o namespace Microsoft.Web.Administration
e C # ou usar o seguinte comando 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
Isso pode resultar em muito desperdício ao longo do tempo para cada site que teve um manipulador removido e, em seguida, adicionado novamente por meio de programação. Existe uma maneira de remover apenas a tag <remove name="ASPClassic" />
usando o código de namespace Microsoft.Web.Administration ou APPCMD
?
Também perguntei sobre isso no Stack Overflow porque o assunto abrangia os dois sites. Esta é a resposta que recebi:
Se você adicionar ou remover manualmente um mapeamento / módulo de manipulador em um determinado site / aplicativo / virdir, você receberá a tag <remove />
adicionada. Agora, se você adicioná-lo manualmente novamente, a tag <remove />
não irá, porque, como no IIS, isso significa que você fez algumas alterações na configuração. Dessa forma, você tem a flexibilidade de adicionar seu próprio mapeamento ou módulo personalizado sobrepondo os módulos / mapeamentos globais.
Sim, isso produzirá muita confusão, mas foi assim que foi tratado ... pelo menos por enquanto. Uma maneira de lidar com isso é clicar em "Reverter para o pai" no painel "Ações".