2011-01-24 107 views
1

我想讓我的C++ ahadmin應用程序與IIS 7兼容。我的應用程序需要讀取網站配置(通過IIS 6中的元數據庫屬性)。IIS 7配置路徑

我讀了很多關於配置的路徑文章,我想我有它是如何工作的一個好主意 - 但是我不知道一兩件事:

要到配置,我可以承諾MACHINE/WEBROOT/APPHOST /路徑或MACHINE/WEBROOT/APPHOST /默認網站。

據我所知,後者是指具體網站的實際web.config,前者是指一般的applicationHost.config文件,其中設置了常規設置。

但是,我的應用程序不知道是否存在web.config文件。

我的問題:如果我想要到達這個路徑 - Object.ConfiguredObject.Site.Bindings,我是否需要提交APPHOST路徑或APPHOST/Default Web Site路徑?

我如何知道在運行時?

回答

1

您將始終將您的綁定提交到MACHINE/WEBROOT/APPHOST

你應該去在看看架構文件:

%systemroot%\System32\inetsrv\config\schema

他們會幫助你確定哪些設置應該屬於。

更新:

每您的評論:

因此,例如,AccessSSLFlags將 被映射到 ConfigurationSection.AccessSection.SslFlags - 我會在這種情況下犯了什麼節?我如何知道我需要提交的部分是哪一部分?

這一切都取決於。 IIS7支持一種名爲Feature Delegation的機制。如果某個功能已委派,那麼這意味着用戶可以在其本地web.config中配置該功能。某些功能配置在system.webServer之下,其他system.web

什麼用戶,不能在本地配置他/她的web.config在兩個文件中的條目進行控制:

%systemrooot%\system32\inetsrv\config\administration.config
%systemrooot%\system32\inetsrv\config\applicationHost.config

如果你去看看在IIS7配置模式:

%systemroot%\System32\inetsrv\config\schema\IIS_schema.xml

什麼,你會發現,有兩種主要類型的部分:

system.applicationHost/xxxx
system.webServer/xxxx

凡是是system.applicationHost配置下一般不考慮用戶修改配置項。事實上,如果你打開applicationHost.config您將看到:

<sectionGroup name="system.applicationHost"> 
    <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
    <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
    <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
    <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
    <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
    <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
    <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
    <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> 
</sectionGroup> 

通知的allowDefinition="AppHostOnly"?這基本上告訴你,這些設置不能在web.config中配置。

功能委派如何工作的範圍太廣,無法覆蓋答案,所以我建議您閱讀上面鏈接的文章。

+0

再次感謝您的回覆。我指定綁定作爲示例 - 但我希望能夠支持映射到IIS配置路徑的所有元數據庫屬性。因此,例如,AccessSSLFlags將被映射到ConfigurationSection.AccessSection.SslFlags - 在那種情況下我會提交哪一部分?我如何知道我需要提交哪一部分? – Ron 2011-01-24 05:00:01

+0

@龍 - 你想要達到的究竟是什麼? – Kev 2011-01-24 10:26:06

1

聽起來好像您正在嘗試構建通用工具來管理配置,因此您可能需要考慮遵循IIS管理器所遵循的類似模式;總之,它總是試圖將配置保存到儘可能最深的路徑。這意味着它將始終通過查看該部分是否被鎖定來將其提交到可能的位置。它使用託管代碼(Microsoft.Web.Administration),但可以使用AppHostElement.GetMetadata(「isLocked」)從C++訪問相同的數據。順便說一下,如果你使用C++,我會強烈建議直接使用AHADMIN(而不是WMI,或其他任何東西),尤其是IAppHostWritableAdminManager

因此,該算法會將CommitPath設置爲與指定的GetAdminSection配置路徑相同的值。然後檢查IsLocked,如果是,然後刪除最後一個「路徑部分」(修剪開始最後一個'/'),並再次閱讀,直到找到該部分解鎖的地方。這是你可以保存它的最深處。另外,如果它是system.web部分,則需要在某個時刻切換到MACHINE/WEBROOT。 IsLocked將尊重部分定義允許位置和其他必需的事物。如果你想做出防彈你甚至需要檢查屬性級鎖定,但我認爲這是相當先進的。