IIS7 - 锁定违规错误、HTTP 处理程序、模块和 <clear /> 元素

Dan*_*fer 18 iis-7 asp.net web.config

我有一个 ASP.NET 站点,它使用自己的一组 HTTP 处理程序并且不需要任何模块。

所以,在 IIS6 中,我所要做的就是在我的 web.config 中:

<httpModules>
    <clear />
</httpModules>
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在system.webServerIIS7 区域中执行相同操作,则在尝试查看站点时会收到 500 错误,而在 IIS 管理器中,当我尝试查看处理程序映射时,我会收到一个带有消息的弹出框:

执行此操作时出错

细节:

文档名称:

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

行号:39

错误:违反锁

第 39 行是<clear />元素所在的位置。

一些谷歌搜索使我找到了一个涉及运行此命令的解决方案:

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

……但这并没有解决问题。

Sco*_*MVP 11

那是设计使然。该<modules>system.webServer的部分本质上定义IIS本身。如果你<clear />,你不会留下任何东西。在 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" />
            ...
Run Code Online (Sandbox Code Playgroud)

注意 lockItem 属性。因为有1个或多个锁项,会抛出锁违例。

因此,您要么只需要从 web.config 中专门删除您不想要的项目,要么如果您真的需要全部清除它们并重新添加您自己的项目,则在 applicationHost.config 中删除 lockItem="true"这些元素中的每一个,并确保添加足够的元素,以便您的 Web 服务器能够实际工作。

编辑

(根据丹尼尔的要求附加了更多信息。(斯科特))

这是我根据 Scott 所说的所做的:

在 %windir%\system32\inetsrv\config 中打开 applicationHost.config。请注意,在 64 位 Windows Server 2008 中,您需要使用 64 位编辑器编辑文件(本机 Notepad 可以,但 Notepad++ 将无法找到该文件)。有关这方面的更多信息,请参见此处。

<system.webServer>元素中,将所有模块上的 lockItem 属性更改为 false。

在我的 web 应用程序的 web.config 文件中,然后能够执行以下操作:

<system.webServer>
   <modules>
      <clear />
   </modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

当然,正如 Scott 指出的那样,这意味着没有剩余的 Web 服务器,所以这里是让我的东西再次运行所需的最少模块集(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" />
Run Code Online (Sandbox Code Playgroud)

另外,对于任何感兴趣的人,这里是我为什么要这样做的背景故事