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 />элемент.

Некоторый поиск в Google привел меня к решению, включающему запуск этой команды:

%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 во всех модулях на false.

В файле 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

Надеюсь, еще не поздно помочь.

Я получил эту проблему сегодня и исправил проблему редактирования в следующем XML-узле ApplicationHost.Config:

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

Удалите это «defaultPath» и перезапустите IIS (iisreset).

Я надеюсь, что это полезно.


0

Попробуйте удалить исходный файл web.config (создать резервную копию) и после внесения изменений через IIS (он создаст новый файл web.config) восстановить исходные изменения. Если вы настраиваете ОШИБКИ HTTP, следуйте этому http://paymentgatewayintegrationhelp.com/Tech-Help/HTTP-Errors-and-webconfig-Lock-Violation-1140.asp

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.