我有一个 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 的说法,我采取了以下措施:
applicationHost.config
在 中打开%windir%\system32\inetsrv\config
。请注意,在 64 位 Windows Server 2008 中,您需要使用 64 位编辑器编辑该文件(本机记事本可以,但 Notepad++ 将无法找到该文件)。请参阅这里了解更多信息。在
<system.webServer>
元素中,将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" />
另外,对于任何感兴趣的人,以下是我这么做的原因。
答案3
我希望提供帮助还不算太晚。
我今天遇到了这个问题,并通过编辑以下 ApplicationHost.Config XML 节点修复了这个问题:
httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath"
删除“,defaultPath”并重新启动 IIS(iisreset)。
我希望它有帮助。
答案4
尝试删除原始文件web.config
(首先创建备份),然后通过 IIS 进行更改(它将创建一个新的web.config
),恢复您对文件所做的原始更改。