Назад | Перейти на главную страницу

IIS7 - Lock Violation error, HTTP handlers, modules, and the <clear> элемент</clear>

У меня есть сайт ASP.NET, который использует собственный набор обработчиков HTTP и не требует никаких модулей.

Итак, в IIS6 все, что мне нужно было сделать, это в моем web.config:

<httpModules>
    <clear />
</httpModules>

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

При выполнении этой операции произошла ошибка

Подробности:

Имя файла:

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

Номер строки: 39

Ошибка: нарушение блокировки

В строке 39 <clear /> элемент есть.

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

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

... но это не решило проблему.

Это по замыслу. Раздел 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" />

Также для всех, кто интересуется, вот предыстория относительно того, почему я это делаю.

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

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

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

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

Надеюсь, это поможет.

Скотт, можешь добавить это в свой ответ?

Вот что я сделал на основании того, что сказал Скотт:

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

Также для всех, кому интересно, вот предыстория того, почему я это делаю.

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