IIS7 - Erro de violação de bloqueio, manipuladores HTTP, módulos e o elemento <clear />

18

Eu tenho um site ASP.NET que usa seu próprio conjunto de manipuladores HTTP e não precisa de nenhum módulo.

Portanto, no IIS6, tudo o que eu precisava fazer era isso no meu web.config:

<httpModules>
    <clear />
</httpModules>

No entanto, se eu tentar fazer o mesmo na system.webServerárea do IIS7, recebo um erro 500 ao tentar visualizar o site e, no gerenciador do IIS, quando tento visualizar os mapeamentos do manipulador, recebo uma caixa pop-up com a mensagem:

Ocorreu um erro ao executar esta operação

Detalhes:

Nome do arquivo:

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

Número da linha: 39

Erro: violação de bloqueio

A linha 39 é onde está o <clear />elemento.

Alguns pesquisadores me levaram a uma solução que envolvia a execução deste comando:

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

... mas isso não resolveu o problema.

Daniel Schaffer
fonte

Respostas:

11

Isso é por design. A seção system.webServer define essencialmente o próprio IIS. Se você, você não ficará com nada. No applicationHost.config, você deve ter algo parecido com isto:

        <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 as propriedades lockItem. Como existem 1 ou mais itens de bloqueio, lançará uma violação de bloqueio.

Portanto, você precisa remover especificamente apenas os itens que não deseja do web.config ou, se realmente precisar limpá-los todos e adicionar seus próprios, em applicationHost.config remova o lockItem = "true" de cada um desses elementos e adicione-os de volta o suficiente para que o servidor da Web funcione.

Editar

(Mais informações em anexo de Daniel, por solicitação dele. (Scott))

Aqui está o que eu fiz com base no que Scott disse:

ApplicationHost.config aberto em% windir% \ system32 \ inetsrv \ config. Observe que no Windows Server 2008 de 64 bits, você precisará editar o arquivo com um editor de 64 bits (o Bloco de Notas nativo o fará, mas o Notepad ++ não poderá encontrar o arquivo). Veja aqui para mais informações sobre isso.

No elemento, altere o atributo lockItem em todos os módulos para false.

No arquivo web.config do meu aplicativo Web, foi possível fazer o seguinte:

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

Obviamente, como Scott ressalta, isso significa que não há servidor da Web, então aqui está o conjunto mínimo de módulos que eu precisava para colocar minhas coisas em execução novamente (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" />

Além disso, para qualquer pessoa interessada, aqui está a história de fundo por que estou fazendo isso.

Scott Forsyth - MVP
fonte
2

Scott, você pode acrescentar isso à sua resposta?

Aqui está o que eu fiz com base no que Scott disse:

  1. Inaugurado applicationHost.configem %windir%\system32\inetsrv\config. Observe que no Windows Server 2008 de 64 bits, você precisará editar o arquivo com um editor de 64 bits (o Bloco de Notas nativo o fará, mas o Notepad ++ não poderá encontrar o arquivo). Veja aqui para mais informações sobre isso.

  2. No <system.webServer>elemento, altere o lockItematributo em todos os módulos para false.

  3. No arquivo web.config do meu aplicativo Web, foi possível fazer o seguinte:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Obviamente, como Scott ressalta, isso significa que não há servidor da Web, então aqui está o conjunto mínimo de módulos que eu precisava para colocar minhas coisas em execução novamente (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" />

Além disso, para qualquer pessoa interessada, aqui está a história de fundo por que estou fazendo isso .

Daniel Schaffer
fonte
Desculpe a formatação desse último bit ... por algum motivo, ela não seria exibida no formato "código" normal.
217 Daniel Schaffer
Coisa certa. Apenas adicionei.
9309 Scott-Forsyth-MVP #
2

Espero que não seja tarde demais para ajudar.

Eu peguei esse problema hoje e corrija o problema de edição do seguinte nó XML ApplicationHost.Config:

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

Remova esse ", defaultPath" e reinicie o IIS (iisreset).

Espero que seja útil.

Mercante
fonte