IIS7: error de infracción de bloqueo, controladores HTTP, módulos y el elemento <clear />

18

Tengo un sitio ASP.NET que usa su propio conjunto de controladores HTTP y no necesita ningún módulo.

Entonces, en IIS6, todo lo que tenía que hacer era esto en mi web.config:

<httpModules>
    <clear />
</httpModules>

Sin embargo, si intento hacer lo mismo en el system.webServerárea de IIS7, aparece un error 500 cuando intento ver el sitio, y en el administrador de IIS cuando intento ver las asignaciones de controladores, aparece un cuadro emergente con el mensaje:

Se produjo un error al realizar esta operación.

Detalles:

Nombre del archivo:

\? \ C: \ Sites \ TheWebSiteGoesHere \ web.config

Número de línea: 39

Error: violación de bloqueo

La línea 39 es donde está el <clear />elemento.

Algunas búsquedas en Google me llevaron a una solución que implica ejecutar este comando:

%windir%\system32\inetsrv\appcmd.exe unlock config -section:system.webServer/modules

... pero eso no resolvió el problema.

Daniel Schaffer
fuente

Respuestas:

11

Eso es por diseño. La sección de system.webServer esencialmente define IIS en sí. Si es así, no te quedará nada. En applicationHost.config, debería tener algo como esto:

        <modules>
            <add name="HttpCacheModule" lockItem="true" />
            <add name="DynamicCompressionModule" lockItem="true" />
            <add name="StaticCompressionModule" lockItem="true" />
            <add name="DefaultDocumentModule" lockItem="true" />
            <add name="DirectoryListingModule" lockItem="true" />
            <add name="IsapiFilterModule" lockItem="true" />
            <add name="ProtocolSupportModule" lockItem="true" />
            <add name="HttpRedirectionModule" lockItem="true" />
            <add name="StaticFileModule" lockItem="true" />
            ...

Observe las propiedades lockItem. Debido a que hay 1 o más elementos de bloqueo, arrojará una violación de bloqueo.

Por lo tanto, debe eliminar específicamente solo los elementos que no desea de web.config, o si realmente necesita borrarlos todos y volver a agregar los suyos, en applicationHost.config elimine lockItem = "true" en cada uno de esos elementos, y asegúrese de volver a agregar suficientes para que su servidor web realmente funcione.

Editar

(Se adjunta más información de Daniel, según su solicitud. (Scott))

Esto es lo que hice en base a lo que dijo Scott:

AplicaciónHost.config abierta en% windir% \ system32 \ inetsrv \ config. Tenga en cuenta que en Windows Server 2008 de 64 bits, deberá editar el archivo con un editor de 64 bits (el Bloc de notas nativo funcionará, pero Notepad ++ no podrá encontrar el archivo). Vea aquí para más información sobre esto.

En el elemento, cambie el atributo lockItem en todos los módulos a falso.

En el archivo web.config de mi aplicación web, pude hacer lo siguiente:

<system.webServer>
   <modules>
      <clear />
   </modules>
</system.webServer>

Por supuesto, como señala Scott, esto significa que no queda ningún servidor web, así que aquí está el conjunto mínimo de módulos que necesitaba para que mis cosas vuelvan a funcionar (YMMV):

<add name="HttpRedirectionModule" lockItem="false" />

<add name="StaticFileModule" lockItem="false" />

<add name="CustomLoggingModule" lockItem="false" />

<add name="CustomErrorModule" lockItem="false" />

<add name="IsapiModule" lockItem="false" />

<add name="AnonymousAuthenticationModule" lockItem="false" />

Además, para cualquier persona interesada, esta es la historia de fondo de por qué estoy haciendo esto.

Scott Forsyth - MVP
fuente
2

Scott, ¿puedes agregar esto a tu respuesta?

Esto es lo que hice en base a lo que dijo Scott:

  1. Inaugurado applicationHost.configen %windir%\system32\inetsrv\config. Tenga en cuenta que en Windows Server 2008 de 64 bits, deberá editar el archivo con un editor de 64 bits (el Bloc de notas nativo funcionará, pero Notepad ++ no podrá encontrar el archivo). Vea aquí para más información sobre esto.

  2. En el <system.webServer>elemento, cambie el lockItematributo en todos los módulos a false.

  3. En el archivo web.config de mi aplicación web, pude hacer lo siguiente:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Por supuesto, como señala Scott, esto significa que no queda ningún servidor web, así que aquí está el conjunto mínimo de módulos que necesitaba para que mis cosas vuelvan a funcionar (YMMV):

    <add name="HttpRedirectionModule" lockItem="false" />

    <add name="StaticFileModule" lockItem="false" />

    <add name="CustomLoggingModule" lockItem="false" />

    <add name="CustomErrorModule" lockItem="false" />

    <add name="IsapiModule" lockItem="false" />

    <add name="AnonymousAuthenticationModule" lockItem="false" />

Además, para cualquier persona interesada, esta es la historia de fondo de por qué estoy haciendo esto .

Daniel Schaffer
fuente
Perdón por el formato en ese último bit ... por alguna razón no lo mostraría en el formato normal de "código".
Daniel Schaffer
Cosa segura. Solo lo agregué.
Scott Forsyth - MVP
2

Espero que no sea demasiado tarde para ayudar.

Tengo este problema hoy y soluciono el problema al editar el siguiente nodo XML ApplicationHost.Config:

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

Elimine ese ", defaultPath" y reinicie IIS (iisreset).

Espero que sea útil.

Mercante
fuente