覆盖app.config(或web.config)中的ConnectionStrings

时间:2009-12-18 09:44:25

标签: asp.net web-config app-config

有没有办法覆盖app.config中的ConnectionString。我们的构建系统也在客户的服务器上运行,但是connectionString需要不同。因为app.config在svn中,每次我在app.config中更改并提交它时,我都需要去客户的服务器将connectionString更改回他们的数据库......

例如,在ant-scripts中,这没有问题,但在app.config中我似乎无法找到方法。试过这个例子:

<connectionStrings configSource="WebConnectionString.config">
  <add name="ConnectionString"
    connectionString="..." 
    providerName="System.Data.SqlClient"/>
</connectionStrings>

我要做的是,如果存在WebConnectionString.config,则使用该配置文件中的connectionString。如果没有,请使用代码示例中定义的那个(因此,在app.config中)。

6 个答案:

答案 0 :(得分:4)

WEB DELPOYMENT PROJECTS WOOHOO

有什么方法可以节省大量的部署悲伤。您可以做的一件非常美妙的事情就是为每位客户提供Build配置。

然后,您还可以为每个包含连接字符串的客户提供配置文件。根据您选择的构建配置,不同的连接字符串将粘贴到web.config中。所以现在你可以为每个客户建立一个“不同”的网站,这很容易。

想象一下名为config的文件夹和cust1ConnectionString.cfg,cust2 ......等文件

现在您创建配置。您已熟悉Release和Debug,创建cust1,cust2。

然后在Web部署项目中,有一个选项可以将Web配置的部分替换为另一个文件中的部分。

所以你去cust1部署并告诉它连接字符串在cust1connectionstrings.cfg文件中。告诉它cust2在哪里等....

现在不再惹恼,每次为客户构建网站时,所有设置都会插入到web.config中,您只需移交正确配置的网站即可。 SVN中的内容并不重要,因为每个客户都有自己的配置。甜

答案 1 :(得分:3)

您可以使用configSource属性执行此操作,但是您必须为每个平台/环境设置一个,因为元素 has to be empty when using this feature

  

但是,当您使用configSource属性时,必须将整个部分移动到单独的文件中,因为没有元素设置的合并。

只有AppSettings部分允许您使用file元素覆盖此类值。

需要考虑的事项:VS2010有一项功能,允许您根据构建目标(实时/发布/调试/测试等)修改配置文件。

答案 2 :(得分:2)

您可以执行以下操作,创建一个用于封装连接字符串检索的类。

类似这样的事情

public static class ConnectionStringBuilder
    {
        const string ConnStringDefault = @"defaultConnString";
        static readonly string _connString = string.Empty;
        public static string Build()
        {
            return _connString;
        }

        /// <summary>
        /// Builds connection string from the config file with the given name
        /// </summary>
        /// <param name="name">The name.</param>
        /// <returns></returns>
        public static string Build(string name)
        {
            if (ConfigurationManager.ConnectionStrings[name] != null)
                return ConfigurationManager.ConnectionStrings[name].ConnectionString;

            throw new ArgumentException("Connectionstring with given name '" + name +"' not found! ", "name");
        }

        /// <summary>
        /// Initializes the <see cref="ConnectionStringBuilder"/> class.
        /// </summary>
        static ConnectionStringBuilder()
        {

            if (ConfigurationManager.ConnectionStrings["default"] != null)
            {
                log.Info("conn string in config found");
                _connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
            }
            else
            {
                log.Info("no default connection string found, using test connection string");
                _connString = ConnStringDefault;
            }
        }
    }

,用法就是这样的

using(var conn = new SqlConnection(ConnectionStringBuilder.Build())
   {
      // do some stuff...
   }

希望有所帮助

答案 3 :(得分:0)

当我们进行构建时,我们将SVN配置替换为生产配置,我们也已经开始使连接字符串完全基于所有应用程序的Web服务,而不管状态是否指向connection string网络服务正确的那些。

答案 4 :(得分:0)

一种方法是使用Web部署项目在构建时替换web.config中的connectionStrings部分。您可以使用一个使用connstrs的调试模式,以及一个保持不变的发布模式。一切都可以完全登记到svn。您还可以使用WDP应用其他自定义的构建后步骤,这非常方便。

另一个选择是将它们完全移动到appSettings中 - 但该文件只包含名称/值对,因此需要更改代码。

答案 5 :(得分:0)

我会将连接字符串移动到machine.config。这样您就不必担心更改任何内容,因为它们都是在服务器上存储/管理的。您现在可以无忧无虑地推送新版本,确保所有连接字符串保持与最初设置的相同。