IIS7 - 锁定冲突错误、HTTP 处理程序、模块和元素

IIS7 - 锁定冲突错误、HTTP 处理程序、模块和元素

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

因此,在 IIS6 中,我要做的就是在 web.config 中执行以下操作:

<httpModules>
    <clear />
</httpModules>

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

执行此操作时出错

细节:

文件名:

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

行号:39

错误:锁定违规

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

通过谷歌搜索,我找到了一个涉及运行以下命令的解决方案:

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

...但这并不能解决问题。

答案1

这是设计使然。system.webServer<modules>部分本质上定义了 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" />
            ...

注意 lockItem 属性。由于有 1 个或多个锁定项,因此将引发锁定冲突。

因此,您要么需要从 web.config 中专门删除您不想要的项目,要么如果您确实需要清除所有项目并重新添加您自己的项目,然后在 applicationHost.config 中删除每个元素上的 lockItem="true",并确保添加足够多的元素,以便您的 Web 服务器能够真正工作。

编辑

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

根据 Scott 的说法,我采取了以下措施:

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

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

在我的 Web 应用程序的 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

斯科特,你能将其附加到你的答案中吗?

根据 Scott 的说法,我采取了以下措施:

  1. applicationHost.config在 中打开%windir%\system32\inetsrv\config。请注意,在 64 位 Windows Server 2008 中,您需要使用 64 位编辑器编辑该文件(本机记事本可以,但 Notepad++ 将无法找到该文件)。请参阅这里了解更多信息。

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

  3. 在我的 Web 应用程序的 Web.config 文件中,然后可以执行以下操作:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. 当然,正如 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" />

另外,对于任何感兴趣的人,以下是我这么做的原因

答案3

我希望提供帮助还不算太晚。

我今天遇到了这个问题,并通过编辑以下 ApplicationHost.Config XML 节点修复了这个问题:

httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath"

删除“,defaultPath”并重新启动 IIS(iisreset)。

我希望它有帮助。

答案4

尝试删除原始文件web.config(首先创建备份),然后通过 IIS 进行更改(它将创建一个新的web.config),恢复您对文件所做的原始更改。

相关内容