IIS7 - 鎖定衝突錯誤、HTTP 處理程序、模組和 <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
…但這並沒有解決問題。
這是設計使然。
<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" /> ...
注意 lockItem 屬性。因為有 1 個或多個鎖項,會拋出鎖衝突。
因此,您要麼需要專門從 web.config 中刪除您不想要的項目,要麼如果您確實需要將它們全部清除並添加回您自己的項目,則在 applicationHost.config 中刪除 lockItem=“true"這些元素中的每一個,並確保添加足夠多的元素,以便您的 Web 伺服器能夠真正工作。
編輯
(根據丹尼爾的要求,附加了丹尼爾的更多資訊。(斯科特))
這是我根據斯科特所說的所做的:
在 %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>
當然,正如 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" />
此外,對於任何感興趣的人,這裡是關於我為什麼這樣做的背景故事。