IIS7 - помилка порушення блокування, обробники HTTP, модулі та елемент <clear />


18

У мене є ASP.NET-сайт, який використовує власний набір обробників HTTP і не потребує жодних модулів.

Отже, в IIS6 все, що мені потрібно було зробити, - це це в моїй web.config:

<httpModules>
    <clear />
</httpModules>

Однак якщо я спробую зробити те саме в system.webServerобласті для IIS7, я отримую помилку 500 при спробі перегляду сайту, а в менеджері IIS, коли я намагаюся переглянути відображення обробників, я отримую спливаюче вікно з повідомленням:

Під час виконання цієї операції сталася помилка

Деталі:

Ім'я файлу:

\? \ C: \ Сайти \ TheWebSiteGoesHere \ web.config

Номер рядка: 39

Помилка: порушення блокування

У рядку 39 знаходиться <clear />елемент.

Якийсь googling привів мене до рішення, пов’язаного із виконанням цієї команди:

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

... але це не вирішило проблему.

Відповіді:


11

Це за дизайном. Розділ system.webServer по суті визначає сам IIS. Якщо ви, то вам нічого не залишиться. У applicationHost.config у вас повинно бути щось подібне:

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

Зауважте властивості lockItem. Оскільки є 1 або більше елементів блокування, це призведе до порушення блокування.

Отже, вам або потрібно спеціально вилучити з web.config лише ті елементи, які вам не потрібні, або якщо вам дійсно потрібно очистити їх усі і додати свої власні, тоді в applicationHost.config видаліть lockItem = "true" на кожен із цих елементів, і переконайтеся, що ви додали їх достатньо, щоб ваш веб-сервер фактично працював.

Редагувати

(Додав додаткову інформацію від Даніеля, на його прохання. (Скотт))

Ось що я зробив на основі сказаного Скоттом:

Відкрито applicationHost.config у% windir% \ system32 \ inetsrv \ config. Зауважте, що в 64-розрядному Windows Server 2008 вам потрібно буде відредагувати файл за допомогою 64-розрядного редактора (вродний Блокнот зробить це, але Notepad ++ не зможе знайти файл). Дивіться тут для отримання додаткової інформації про це.

В елементі змініть атрибут lockItem на всіх модулях на хибний.

У файлі web.config мого веб-додатку тоді можна було зробити наступне:

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

Звичайно, як зазначає Скотт, це означає, що веб-сервера не залишилося, тому ось мінімальний набір модулів, який мені потрібен, щоб знову запустити свої речі (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" />

Також для всіх, хто цікавиться, ось історія , чому я це роблю.


2

Скотт, ти можеш додати це до своєї відповіді?

Ось що я зробив на основі сказаного Скоттом:

  1. Відкрито applicationHost.configв %windir%\system32\inetsrv\config. Зауважте, що в 64-розрядному Windows Server 2008 вам потрібно буде відредагувати файл за допомогою 64-розрядного редактора (вродний Блокнот зробить це, але Notepad ++ не зможе знайти файл). Дивіться тут для отримання додаткової інформації про це.

  2. У <system.webServer>елементі змініть lockItemатрибут на всіх модулях на false.

  3. У файлі web.config мого веб-додатку тоді можна було зробити наступне:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Звичайно, як зазначає Скотт, це означає, що веб-сервера не залишилося, тому ось мінімальний набір модулів, який мені потрібен, щоб знову запустити свої речі (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" />

Також для всіх, хто цікавиться, ось історія, чому я це роблю .


Вибачте за форматування цього останнього біта ... чомусь він не відображатиме його у звичайному "кодовому" форматі.
Даніель Шаффер

Ясна річ. Просто додав його.
Скотт Форсайт - MVP

2

Я сподіваюся, що не пізно допомогти.

Я отримав цю проблему сьогодні і вирішую проблему редагування після вузла ApplicationHost.Config XML:

httpErrors lockAttributes = "enableAbsolutePathsWhenDelegated, defaultPath"

Видаліть цей ", defaultPath" і перезапустіть IIS (iisreset).

Я сподіваюся, що її допоможе.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.