Como faço para manipular mapeamentos de manipuladores de maneira limpa no iIS7 usando o espaço para nome do Microsoft.Web.AdMinistration?

StackOverflow https://stackoverflow.com/questions/1671702

  •  13-09-2019
  •  | 
  •  

Pergunta

Ao manipular mapeamentos de manipuladores usando o Microsoft.Web.Administration namespace, existe uma maneira de remover o <remove name="handler name"> no nível do local.

Por exemplo, eu tenho um site que herda todos os mapeamentos do manipulador da configuração do Global Handler Mapelings. Dentro applicationHost.config a <location> tag inicialmente se parece com o seguinte:

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

Para remover um manipulador, uso o código semelhante:

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);
}

Isso resulta no site <location> Tag parece:

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

Até agora tudo bem. No entanto, se eu re-adquirir o ASPClassic Manipulador isso resulta em:

<location path="60030 - testsite-60030.com">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication userName="" />
      </authentication>
    </security>    
    <handlers>
      <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 pode resultar em muito Cruft ao longo do tempo para cada site que teve um manipulador removido e depois re-addiava programaticamente. Existe uma maneira de apenas remover o <remove name="ASPClassic" /> Usando o código namespace Microsoft.Web.Administration?

Foi útil?

Solução

Eu discuti isso com a equipe de produtos do IIS e isso parece ser um bug no sistema de configuração. O mais interessante é que, quando tento esse código no Win7 com o IIS 7.5, não consigo nem adquirir o manipulador programaticamente. Tentar fazer isso resulta em uma exceção com que afirma:

"Erro: não é possível adicionar a entrada de coleta duplicada do tipo 'Adicionar' com o atributo de chave exclusivo 'nome' definido como 'aspclassic'"

Isso se torna ainda mais problemático porque, uma vez que um usuário "remove" um manipulador para um local, ele não pode ser adicionado na API MWA até que esse bug seja corrigido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top