IIS7 - Błąd blokady naruszenia, procedury obsługi HTTP, moduły i element <clear />

18

Mam witrynę ASP.NET, która używa własnego zestawu programów obsługi HTTP i nie potrzebuje żadnych modułów.

Tak więc w IIS6 wszystko, co musiałem zrobić, to to w moim web.config:

<httpModules>
    <clear />
</httpModules>

Jeśli jednak spróbuję zrobić to samo w system.webServerobszarze dla usług IIS7, otrzymam błąd 500, gdy spróbuję wyświetlić witrynę, aw menedżerze usług IIS, gdy spróbuję wyświetlić odwzorowania programu obsługi, otrzymam wyskakujące okienko z komunikatem:

Wystąpił błąd podczas wykonywania tej operacji

Detale:

Nazwa pliku:

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

Numer linii: 39

Błąd: zablokuj naruszenie

Linia 39 to miejsce, w którym znajduje się <clear />element.

Niektóre googling doprowadziły mnie do rozwiązania polegającego na uruchomieniu tego polecenia:

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

... ale to nie rozwiązało problemu.

Daniel Schaffer
źródło

Odpowiedzi:

11

To z założenia. Sekcja system.webServer zasadniczo definiuje sam IIS. Jeśli tak, nie pozostaniesz z niczym. W applicationHost.config powinieneś mieć coś takiego:

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

Zwróć uwagę na właściwości lockItem. Ponieważ istnieje 1 lub więcej elementów zamka, spowoduje naruszenie zasad zamka.

Więc albo musisz specjalnie usunąć tylko te elementy, których nie chcesz z web.config, lub jeśli naprawdę musisz je wyczyścić i dodać z powrotem własne, to w applicationHost.config usuń lockItem = "true" na każdego z tych elementów i upewnij się, że dodałeś wystarczającą ich liczbę, aby serwer WWW faktycznie działał.

Edytować

(Dołączone dodatkowe informacje od Daniela, na jego wniosek. (Scott))

Oto, co zrobiłem na podstawie tego, co powiedział Scott:

Otwarty applicationHost.config w% windir% \ system32 \ inetsrv \ config. Zauważ, że w 64-bitowym systemie Windows Server 2008 musisz edytować plik za pomocą 64-bitowego edytora (natywny Notatnik to zrobi, ale Notepad ++ nie będzie w stanie znaleźć pliku). Zobacz tutaj, aby uzyskać więcej informacji na ten temat.

W elemencie zmień atrybut lockItem we wszystkich modułach na false.

W pliku web.config mojej aplikacji internetowej byłem w stanie wykonać następujące czynności:

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

Oczywiście, jak zauważa Scott, oznacza to, że nie ma już serwera WWW, więc oto minimalny zestaw modułów, których potrzebowałem, aby ponownie uruchomić moje rzeczy (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" />

Ponadto, dla wszystkich zainteresowanych, oto historia, dlaczego to robię.

Scott Forsyth - MVP
źródło
2

Scott, możesz dołączyć to do swojej odpowiedzi?

Oto, co zrobiłem na podstawie tego, co powiedział Scott:

  1. Otwarty applicationHost.configw %windir%\system32\inetsrv\config. Pamiętaj, że w 64-bitowym systemie Windows Server 2008 musisz edytować plik za pomocą 64-bitowego edytora (natywny Notatnik to zrobi, ale Notepad ++ nie będzie w stanie znaleźć pliku). Zobacz tutaj, aby uzyskać więcej informacji na ten temat.

  2. W <system.webServer>elemencie zmień lockItematrybut we wszystkich modułach na false.

  3. W pliku web.config mojej aplikacji internetowej byłem w stanie wykonać następujące czynności:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Oczywiście, jak zauważa Scott, oznacza to, że nie ma już serwera WWW, więc oto minimalny zestaw modułów, których potrzebowałem, aby ponownie uruchomić moje rzeczy (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" />

Ponadto, dla wszystkich zainteresowanych, oto historia, dlaczego to robię .

Daniel Schaffer
źródło
Przepraszam za formatowanie tego ostatniego bitu ... z jakiegoś powodu nie wyświetlałby go w normalnym formacie „kodu”.
Daniel Schaffer,
Jasne. Właśnie to dodałem.
Scott Forsyth - MVP
2

Mam nadzieję, że nie jest za późno na pomoc.

Mam ten problem dzisiaj i naprawiłem problem z edycją następującego węzła XML ApplicationHost.Config:

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

Usuń to „, defaultPath” i uruchom ponownie IIS (iisreset).

Mam nadzieję, że to pomocne.

Mercante
źródło