18 votos

IIS7 - Error de violación de bloqueo, manejadores HTTP, módulos y el elemento <clear />

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

Así, en IIS6, todo lo que tuve que hacer fue esto en mi web.config:

<httpModules>
    <clear />
</httpModules>

Sin embargo, si intento hacer lo mismo en el system.webServer para IIS7, obtengo un error 500 cuando intento ver el sitio, y en el gestor de IIS cuando intento ver las asignaciones de los manejadores, me aparece un cuadro emergente con el mensaje:

Se ha producido 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 se encuentra el <clear /> elemento es.

Un poco de búsqueda en Google me llevó a una solución que implica la ejecución de este comando:

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

...pero eso no resolvió el problema.

11voto

Scott Forsyth - MVP Puntos 12030

Eso es por diseño. El <modules> de system.webServer define esencialmente al propio IIS. Si usted <clear /> No te quedarás con nada. En applicationHost.config, deberías tener algo así:

        <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" />
            ...

Fíjate en las propiedades lockItem. Debido a que hay 1 o más elementos de bloqueo, lanzará una violación de bloqueo.

Así que, o bien necesitas eliminar específicamente sólo los elementos que no quieres de web.config, o si realmente necesitas borrarlos todos y volver a añadir los tuyos, entonces en applicationHost.config elimina el lockItem="true" en cada uno de esos elementos, y asegúrate de volver a añadir los suficientes para que tu servidor web funcione realmente.

Editar

(Se adjunta más información de Daniel, a petición suya. (Scott))

Esto es lo que hice basándome en lo que dijo Scott:

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

En el <system.webServer> cambie el atributo lockItem de todos los módulos a false.

En el archivo web.config de mi aplicación web, pude entonces 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 volvieran 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 quien esté interesado, aquí está el historia de fondo en cuanto a por qué estoy haciendo esto.

3voto

Daniel Schaffer Puntos 270

Scott, ¿puedes añadir esto a tu respuesta?

Esto es lo que hice basándome en lo que dijo Scott:

  1. Abierto applicationHost.config en %windir%\system32\inetsrv\config . Tenga en cuenta que en Windows Server 2008 de 64 bits, tendrá que editar el archivo con un editor de 64 bits (el Notepad nativo servirá, pero el Notepad++ no podrá encontrar el archivo). Ver aquí para obtener más información al respecto.

  2. En el <system.webServer> cambiar el elemento lockItem en todos los módulos para false .

  3. En el archivo web.config de mi aplicación web, pude entonces 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 I necesario 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 quien esté interesado, Aquí está la historia de por qué estoy haciendo esto .

0 votos

Perdón por el formato de la última parte... por alguna razón no lo mostraba en formato normal de "código".

0 votos

Claro que sí. Acabo de añadirlo.

2voto

Mercante Puntos 21

Espero que no sea demasiado tarde para ayudar.

Hoy he tenido este problema y lo he solucionado editando el siguiente nodo XML ApplicationHost.Config:

httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath"

Elimine esa ",defaultPath" y reinicie su IIS (iisreset).

Espero que sea útil.

0voto

Victor Stafusa Puntos 101

Pruebe a eliminar su original web.config (crear una copia de seguridad primero), y después de hacer los cambios a través de IIS (se creará un nuevo web.config ), restaura los cambios originales que habías hecho en el archivo.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: