Configuration 什么';获取应用程序设置的一致方法是什么?

Configuration 什么';获取应用程序设置的一致方法是什么?,configuration,iis-7,appsettings,Configuration,Iis 7,Appsettings,因此,appSettings可以在app.config、web.config、machine、config。。。但是,当您在IIS 7下工作时,您还可以在applicationHost.config下应用appSettings,并为您的站点进行特定的裁剪。那么,对于我来说,什么是一种一致的方式来知道我应该使用什么应用程序设置 如果这是一个客户端配置文件,System.Configuration.ConfigurationManager就可以了。 System.Web.Configuration.

因此,appSettings可以在app.config、web.config、machine、config。。。但是,当您在IIS 7下工作时,您还可以在applicationHost.config下应用appSettings,并为您的站点进行特定的裁剪。那么,对于我来说,什么是一种一致的方式来知道我应该使用什么应用程序设置

如果这是一个客户端配置文件,System.Configuration.ConfigurationManager就可以了。 System.Web.Configuration.WebConfiguration Manager如果这是一个Web应用。。。嗯,也许吧。 Microsoft.Web.Administration如果我期望applicationHosting.config中的值-哎哟。。。即使这样,它们也不会按等级进行汇总,所以看起来你仍在继续这个过程


是否有人有一致的方法来处理说明applicationHost.config的应用程序设置?

您不能在
applicationHost.config
文件中实际指定
。这是因为
applicationHost.config
只定义了特定于IIS的设置。您可以查看
applicationHost.config
架构以确认这一点:

%systemroot%\System32\inetsrv\config\schema\IIS\u schema.xml

如果尝试编辑
applicationHost.config
并将
节添加到站点或
节下,您将收到错误(IIS可能无法启动,IIS MMC控制台将显示配置错误)

如果在IIS管理器中配置全局应用程序设置,则实际上会在主
web.config
文件中进行配置,该文件与IIS中的默认.NET Framework版本设置相匹配

特定于.NET Framework,只能在以下位置进行配置:

%SYSTEMROOT%\Microsoft.NET\Framework\[framework version]\CONFIG\machine.config %SYSTEMROOT%\Microsoft.NET\Framework\[framework version]\CONFIG\web.config %SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\CONFIG\machine.config %SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\CONFIG\web.config 在
web.config
中:

Global.asax.cs
中应用程序的
application\u Start
事件中,初始化应用程序范围的值:

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    string httpHost = HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
    Application["SitePrefix"] = GetSiteKeyFromDb(httpHost);
}
此值将在整个应用程序中可用,但对站点是唯一的

当您需要读取特定于站点的设置时:

string siteSetting = ConfigurationManager.AppSettings[
    HttpContext.Current.Application["SitePrefix"] + "_Setting1"
];

但是,如果您在
应用程序\u Start
中访问数据库,那么将所有这些特定于站点的设置存储在数据库中,然后在
应用程序中读取并缓存它们,而不是使用

我使用了的答案提供的信息来完成此操作,但我不想解析并有另一个数据库来查找信息。相同的代码库是在前提下使用的,我不会在那个场景中使用这些代码

只需将
appSettings
添加到带有
location
节点的.NET Framework
web.config

%SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\Config\web.Config
中,添加以下内容,其中
Site1
Site2
是指向同一物理目录的两个应用程序:

<?xml version="1.0" encoding="utf-8"?>
<!-- the root web configuration file -->
<configuration>

    <!-- App settings for the different applications -->
    <location path="Default Web Site/Site1">
        <appSettings>
            <add key="ConnectionString" value="the cnn str"/>
        </appSettings>
    </location>
    <location path="Default Web Site/Site2">
        <appSettings>
            <add key="ConnectionString" value="the cnn str"/>
        </appSettings>
    </location>

...

</configuration> 

...

物理文件夹中的
web.config
将覆盖此
appSetting
,因此我还需要将其从该文件中删除。

您可能是对的。。。虽然当我把它放在那个位置下时,它没有给出任何错误。至于细节。。。它与使用单个物理路径承载多个虚拟主机有关。一个简短而不幸的答案是,虽然您可以重用代码,但仍然只剩下一个配置,您必须将答案从HTTP_主机上删除。我试图避免编写代码来处理特定于主机的配置,因为IIS正是这么做的。哦,好吧,活到老学到老。@ajaxx-当你说多个虚拟主机时,你是指一个具有多个主机头的站点,还是指指向同一物理文件夹的多个站点?同一物理主机上的多个站点都指向同一物理文件夹。这是一个asp.net网站,几乎所有内容都是数据驱动的。没有理由复制部署的资源,所以我们没有。唯一需要注意的是,我们希望能够进行基于站点的配置,而不是基于物理路径(web.config)。我们将通过依赖服务器变量来做出一些关键决策来解决这个问题。感谢Kev的更新。这与我们到达的地方基本相同,即配置必须由HTTP_主机驱动。
<?xml version="1.0" encoding="utf-8"?>
<!-- the root web configuration file -->
<configuration>

    <!-- App settings for the different applications -->
    <location path="Default Web Site/Site1">
        <appSettings>
            <add key="ConnectionString" value="the cnn str"/>
        </appSettings>
    </location>
    <location path="Default Web Site/Site2">
        <appSettings>
            <add key="ConnectionString" value="the cnn str"/>
        </appSettings>
    </location>

...

</configuration>