IIS7 - Erreur de violation de verrouillage, gestionnaires HTTP, modules et élément <clear />

18

J'ai un site ASP.NET qui utilise son propre ensemble de gestionnaires HTTP et n'a pas besoin de modules.

Donc, dans IIS6, tout ce que j'avais à faire était ceci dans mon web.config:

<httpModules>
    <clear />
</httpModules>

Cependant, si j'essaie de faire la même chose dans la system.webServerzone pour IIS7, j'obtiens une erreur 500 lorsque j'essaie d'afficher le site, et dans le gestionnaire IIS lorsque j'essaie d'afficher les mappages de gestionnaires, j'obtiens une boîte contextuelle avec le message:

Une erreur s'est produite lors de l'exécution de cette opération

Détails:

Nom de fichier:

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

Numéro de ligne: 39

Erreur: violation de verrouillage

La ligne 39 est l'endroit où se trouve l' <clear />élément.

Une recherche sur Google m'a conduit à une solution impliquant l'exécution de cette commande:

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

... mais cela n'a pas résolu le problème.

Daniel Schaffer
la source

Réponses:

11

C'est par conception. La section de system.webServer définit essentiellement IIS lui-même. Si vous, vous ne resterez avec rien. Dans applicationHost.config, vous devriez avoir quelque chose comme ceci:

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

Notez les propriétés lockItem. Parce qu'il y a 1 ou plusieurs éléments de verrouillage, une violation de verrouillage sera générée.

Donc, vous devez soit supprimer spécifiquement les éléments que vous ne voulez pas de web.config, ou si vous avez vraiment besoin de les effacer tous et d'ajouter les vôtres, puis dans applicationHost.config, supprimez lockItem = "true" sur chacun de ces éléments, et assurez-vous d'en rajouter suffisamment pour que votre serveur Web fonctionne réellement.

Éditer

(Ajout d'informations complémentaires de Daniel, à sa demande. (Scott))

Voici ce que j'ai fait sur la base de ce que Scott a dit:

ApplicationHost.config ouverte dans% windir% \ system32 \ inetsrv \ config. Notez que dans Windows Server 2008 64 bits, vous devrez modifier le fichier avec un éditeur 64 bits (le Bloc-notes natif fera l'affaire, mais Notepad ++ ne pourra pas trouver le fichier). Voir ici pour plus d'informations à ce sujet.

Dans l'élément, remplacez l'attribut lockItem de tous les modules par false.

Dans le fichier web.config de mon application Web, j'ai ensuite pu effectuer les opérations suivantes:

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

Bien sûr, comme le souligne Scott, cela signifie qu'il n'y a plus de serveur Web, alors voici l'ensemble minimal de modules dont j'avais besoin pour faire fonctionner à nouveau mes fichiers (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" />

Aussi, pour toute personne intéressée, voici la trame de fond de la raison pour laquelle je fais cela.

Scott Forsyth - MVP
la source
2

Scott, pouvez-vous ajouter ceci dans votre réponse?

Voici ce que j'ai fait sur la base de ce que Scott a dit:

  1. Ouvert applicationHost.configen %windir%\system32\inetsrv\config. Notez que dans Windows Server 2008 64 bits, vous devrez modifier le fichier avec un éditeur 64 bits (le Bloc-notes natif fera l'affaire, mais Notepad ++ ne pourra pas trouver le fichier). Voir ici pour plus d'informations à ce sujet.

  2. Dans l' <system.webServer>élément, changez l' lockItemattribut de tous les modules en false.

  3. Dans le fichier web.config de mon application Web, j'ai ensuite pu effectuer les opérations suivantes:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Bien sûr, comme le souligne Scott, cela signifie qu'il n'y a plus de serveur Web, alors voici l'ensemble minimal de modules dont j'avais besoin pour faire fonctionner à nouveau mes fichiers (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" />

Aussi, pour toute personne intéressée, voici la trame de fond de la raison pour laquelle je fais cela .

Daniel Schaffer
la source
Désolé pour la mise en forme de ce dernier bit ... pour une raison quelconque, il ne l'afficherait pas au format "code" normal.
Daniel Schaffer
Chose sûre. Je viens de l'ajouter.
Scott Forsyth - MVP
2

J'espère qu'il n'est pas trop tard pour vous aider.

J'ai rencontré ce problème aujourd'hui et corrige le problème de modification du nœud XML ApplicationHost.Config suivant:

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

Supprimez ", defaultPath" et redémarrez IIS (iisreset).

J'espère que c'est utile.

Mercante
la source