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


18

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

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

<httpModules>
    <clear />
</httpModules>

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

执行此操作时出错

细节:

文件名:

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

行号:39

错误:违反锁

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

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

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

...但是那并不能解决问题。

Answers:


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”每个元素,并确保将它们添加回去,以便您的Web服务器可以正常工作。

编辑

(根据Daniel的要求,从Daniel处获得了进一步的信息。(斯科特)

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

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

在元素中,将所有模块上的lockItem属性更改为false。

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

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

当然,正如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" />

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


2

斯科特,您可以将此附加到您的答案中吗?

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

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

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

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

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. 当然,斯科特指出,这意味着有离开,所以这里没有Web服务器模块的最小集合需要让我的东西重新运行(因人而异):

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

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


抱歉,最后一点的格式...由于某种原因,它无法以正常的“代码”格式显示。
丹尼尔·谢弗

当然可以 刚刚添加。
Scott Forsyth-MVP,

2

我希望为时不晚。

我今天遇到了这个问题,并解决了在ApplicationHost.Config XML节点之后进行编辑的问题:

httpErrors lockAttributes =“ allowAbsolutePathsWhenDelegated,defaultPath”

删除该“,defaultPath”,然后重新启动IIS(iisreset)。

希望对您有所帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.