¿Cómo manipulo limpiamente las asignaciones de controladores en IIS7 usando el espacio de nombres de Microsoft.Web.administration?

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

  •  13-09-2019
  •  | 
  •  

Pregunta

Al manipular las asignaciones de manejadores usando el Microsoft.Web.Administration espacio de nombres, ¿hay alguna forma de eliminar el <remove name="handler name"> a nivel de sitio.

Por ejemplo, tengo un sitio que hereda todas las asignaciones de controladores de la configuración de asignaciones de controladores globales. En applicationHost.config la <location> La etiqueta inicialmente se ve así:

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

Para eliminar un controlador, uso un código similar esto:

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

Esto da como resultado el sitio del sitio <location> Etiqueta que parece:

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

Hasta aquí todo bien. Sin embargo, si vuelvo a agregar el ASPClassic manejador esto da como resultado:

<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>

Esto puede resultar en mucho Cruft con el tiempo para cada sitio web que se le ha eliminado un controlador y luego se vuelve a agregar programáticamente. ¿Hay alguna forma de eliminar el <remove name="ASPClassic" /> ¿Usando el código de espacio de nombres Microsoft.Web.administration?

¿Fue útil?

Solución

He discutido esto con el equipo de productos IIS y esto parece ser un error con el sistema de configuración. Lo que es más interesante es que cuando intento este código en Win7 con IIS 7.5, ni siquiera puedo volver a agregar el controlador programáticamente. Intentar hacerlo resulta en una excepción de COM que indique:

"Error: no se puede agregar la entrada de colección duplicada del tipo 'Agregar' con el atributo de clave único 'Nombre' establecido en 'AspClassic'"

Eso se vuelve aún más problemático porque una vez que un usuario ha "eliminado" un controlador para una ubicación, no se puede volver a agregar a través de la API MWA hasta que se corrija este error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top