IIS7 - Sperrverletzungsfehler, HTTP-Handler, Module und das Element <clear />

18

Ich habe eine ASP.NET-Site, die einen eigenen Satz von HTTP-Handlern verwendet und keine Module benötigt.

In IIS6 musste ich also nur Folgendes in meiner web.config tun:

<httpModules>
    <clear />
</httpModules>

Wenn ich jedoch versuche, dasselbe in dem system.webServerBereich für IIS7 zu tun, wird bei dem Versuch, die Site anzuzeigen, eine 500-Fehlermeldung angezeigt, und bei dem Versuch, die Handlerzuordnungen im IIS-Manager anzuzeigen, wird ein Popup-Fenster mit der folgenden Meldung angezeigt:

Bei dieser Operation ist ein Fehler aufgetreten

Einzelheiten:

Dateiname:

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

Zeilennummer: 39

Fehler: Sperrverletzung

In Zeile 39 steht das <clear />Element.

Ein bisschen googeln führte mich zu einer Lösung, bei der dieser Befehl ausgeführt wurde:

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

... aber das hat das Problem nicht gelöst.

Daniel Schaffer
quelle

Antworten:

11

Das ist so gewollt. Der Abschnitt von system.webServer definiert im Wesentlichen IIS selbst. Wenn Sie, werden Sie mit nichts verlassen. In applicationHost.config sollten Sie ungefähr Folgendes haben:

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

Beachten Sie die lockItem-Eigenschaften. Da es 1 oder mehr Sperrelemente gibt, wird eine Sperrverletzung ausgelöst.

Sie müssen also entweder nur die Elemente, die Sie nicht möchten, speziell aus der Datei web.config entfernen oder, wenn Sie wirklich alle Elemente löschen und Ihre eigenen hinzufügen müssen, in der Datei applicationHost.config das Kontrollkästchen lockItem = "true" aktivieren Stellen Sie sicher, dass Sie genügend Elemente hinzufügen, damit Ihr Webserver tatsächlich funktioniert.

Bearbeiten

(Weitere Informationen von Daniel sind seinem Antrag beigefügt. (Scott))

Hier ist, was ich basierend auf dem, was Scott gesagt hat, getan habe:

Geöffnete applicationHost.config in% windir% \ system32 \ inetsrv \ config. Beachten Sie, dass Sie in 64-Bit-Windows Server 2008 die Datei mit einem 64-Bit-Editor bearbeiten müssen (der native Editor kann, Notepad ++ kann die Datei jedoch nicht finden). Weitere Informationen hierzu finden Sie hier.

Ändern Sie in dem Element das lockItem-Attribut für alle Module in false.

Konnte dann in der Datei web.config meiner Webanwendung Folgendes tun:

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

Wie Scott ausführt, bedeutet dies natürlich, dass kein Webserver mehr vorhanden ist. Hier ist also die minimale Anzahl von Modulen, die ich benötige, um meine Sachen wieder zum Laufen zu bringen (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" />

Für alle Interessierten ist hier die Hintergrundgeschichte , warum ich das tue.

Scott Forsyth - MVP
quelle
2

Scott, kannst du das in deine Antwort einfügen?

Hier ist, was ich basierend auf dem, was Scott gesagt hat, getan habe:

  1. Geöffnet applicationHost.configin %windir%\system32\inetsrv\config. Beachten Sie, dass Sie in 64-Bit-Windows Server 2008 die Datei mit einem 64-Bit-Editor bearbeiten müssen (der native Editor kann, Notepad ++ kann die Datei jedoch nicht finden). Weitere Informationen hierzu finden Sie hier .

  2. <system.webServer>Ändern Sie im Element das lockItemAttribut für alle Module in false.

  3. Konnte dann in der Datei web.config meiner Webanwendung Folgendes tun:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Wie Scott ausführt, bedeutet dies natürlich, dass kein Webserver mehr vorhanden ist. Hier ist also die minimale Anzahl von Modulen, die ich benötige, um meine Sachen wieder zum Laufen zu bringen (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" />

Für alle Interessierten ist hier die Hintergrundgeschichte, warum ich das tue .

Daniel Schaffer
quelle
Entschuldigung für die Formatierung des letzten Bits ... aus irgendeinem Grund würde es nicht im normalen "Code" -Format angezeigt.
Daniel Schaffer
Sichere Sache. Fügte es einfach hinzu.
Scott Forsyth - MVP
2

Ich hoffe, es ist nicht zu spät, um zu helfen.

Ich habe dieses Problem heute erhalten und das Problem bei der Bearbeitung des folgenden ApplicationHost.Config-XML-Knotens behoben:

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

Entfernen Sie ", defaultPath" und starten Sie IIS neu (iisreset).

Ich hoffe es ist hilfreich.

Mercante
quelle