asp.net管理多个web.config文件

时间:2009-03-29 00:09:45

标签: asp.net visual-studio web-config

有人能建议一个管理多个web.config文件的好方法吗?

例如,我有一个开发web.config,我在我的localmachine上使用名为“localWeb.config”,然后我用于生产名为“prodWeb.config”。我保留了.config扩展名,因此没有人可以从Web服务器访问它们。

localWeb.config例如有一个连接字符串到开发数据库,​​而prodWeb.config有一个到生产数据库。

目前,我正在使用postbuild事件将localWeb.config或prodWeb.config的内容复制到web.config。这很有效,但我想知道是否有人知道更好的方法。

4 个答案:

答案 0 :(得分:3)

您可以查看此CodeCarnage page中列出的方法是否更符合您的需求。它利用configsource属性指向DB和APP设置,每个设置都由环境分隔。这可能允许您在web.config中保留一致的内容,并在其他配置文件中保留特定于环境的“东西”。

答案 1 :(得分:2)

查看Web Deployment Tool

  

以下是一些任务   使用该工具完成:

     
      
  1. 创建包含内容,配置和SQL的包   用于部署或共享的数据库   和其他人。

  2.   
  3. 使用该程序包作为版本应用程序或创建备份的方法。

  4.   
  5. 添加参数以替换连接字符串或其他值   安装包时的文件。

  6.   
  7. 使非管理员能够部署软件包并精确控制它们   访问。

  8.   
  9. 同步或迁移运行IIS 6.0和IIS的站点和服务器   7.0。

  10.   

答案 2 :(得分:1)

我保留一个配置文件并在运行时使用逻辑来检测要使用的配置子集。如果主机名是“prodsrvr- *”,那么我使用生产服务器配置,包括数据库连接等。如果主机名是“test- *”,那么我使用测试配置数据。等等。

编辑:这里有一些代码可以完成我所描述的内容。

public static string GetConnString()
{
    string connString = ConfigurationSettings.AppSettings[GetConfigKey("database")];
    return connString;
}

public static string GetConfigKey(string baseKey)
{
    string str = baseKey;
    if (Dns.GetHostName().StartsWith("dinoch"))
    {
        str = str + "-dev";
    }
    else if (Dns.GetHostName().StartsWith("prodsrvr"))
    {
        str = str + "-prod";
    }
    return str;
}

<configuration>
   <appSettings>
     <add key="database-dev" value="server=(local)\vsdotnet;database=ASPXAPPS;Integrated Security=SSPI" />
     <add key="database-prod" value="server=(local)\vsdotnet;database=ASPXAPPS;Integrated Security=SSPI" />
   </appSettings>
</configuration>

我使用一个简单的StartsWith(),其中一些“魔术字符串”是硬编码的。

为了避免这种情况,我可以想象在web.config文件中定义一个正则表达式的后缀。其中,如果regex1与主机名匹配,则使用suffix1。如果是regex2,那么使用suffix2。等等。您只需加载地图一次,然后只需加载一个foreach()枚举正则表达式并返回它们是否与主机名匹配。

或者,您可能希望使用不同的标准,以区分prod和dev与测试服务器,而不是主机名。这取决于你。

答案 3 :(得分:1)

这将继续是一个黑客,直到asp.net 4到达http://www.asp.net/learn/whitepapers/aspnet40/#_Toc223325501