我正在尝试使我的c ++ ahadmin应用程序与IIS 7兼容。我的应用程序需要读取网站配置(通过IIS 6中的配置数据库属性)。
我阅读了很多关于配置路径的文章,我想我对它是如何工作有很好的了解 - 但是我不确定一件事:
要进行配置,我可以提交MACHINE / WEBROOT / APPHOST /路径或MACHINE / WEBROOT / APPHOST /默认网站。
我理解后者是指特定网站的实际web.config
,前者是指一般applicationHost.config
文件,其中设置了常规设置。
我的应用程序不知道是否存在web.config
文件。
我的问题:如果我想要走这条路 - Object.ConfiguredObject.Site.Bindings
,我是否需要提交APPHOST
路径或APPHOST/Default Web Site
路径?
我怎么知道在运行时?
答案 0 :(得分: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
中配置这些设置。
功能委托的工作范围太宽,无法在答案中涵盖,所以我建议你阅读上面链接的文章。
答案 1 :(得分:1)
听起来您正在尝试构建一个通用工具来管理配置,因此您可能需要考虑遵循IIS Manager遵循的类似模式;简而言之,它总是试图将配置保存到最深的路径。这意味着它总是通过查看部分是否被锁定将其提交到可以的地方。它使用托管代码(Microsoft.Web.Administration),但您可以使用AppHostElement.GetMetadata(“isLocked”)从C ++访问相同的数据。 顺便说一句,如果你使用C ++,我强烈建议直接使用AHADMIN(而不是WMI或其他任何东西),特别是IAppHostWritableAdminManager。
因此,该算法将CommitPath设置为与指定的GetAdminSection配置路径相同的值。然后检查IsLocked,如果是,则删除最后一个“路径部分”(修剪开始最后一个'/'),然后再次读取,直到找到该部分解锁的位置。这是您可以保存它的最深处。此外,如果是system.web部分,则需要在某些时候切换到MACHINE / WEBROOT。 IsLocked将尊重Section Definition允许位置和其他所需的东西。如果你想让它成为防弹,你甚至需要检查属性级锁定,但我认为这是非常先进的。