【问题标题】:Override ConnectionStrings in app.config (or web.config)覆盖 app.config(或 web.config)中的 ConnectionStrings
【发布时间】:2010-12-27 23:44:14
【问题描述】:

有没有办法覆盖 app.config 中的 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 中)。

【问题讨论】:

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


    【解决方案1】:

    WEB 部署项目 WOOHOO

    这是一种节省大量部署痛苦的方法。您可以做的一件非常美妙的事情就是为每个客户提供一个构建配置。

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

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

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

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

    因此,您转到 cust1 部署并告诉它连接字符串在文件 cust1connectionstrings.cfg 中。告诉它 cust2 在哪里等等......

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

    【讨论】:

      【解决方案2】:

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

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

      只有AppSettings 部分允许您使用file 元素覆盖这样的值。

      需要考虑的一点:VS2010 有一个功能,允许您根据构建目标(live/release/debug/test 等)修改配置文件。

      【讨论】:

      • 是的,但这给我留下了同样的问题。如果我提交 configSource 文件,我也会遇到同样的问题。但可以选择不提交。
      • 是的,使用这种方法,您不必签入配置,这可能是一个问题。
      【解决方案3】:

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

      类似的东西

      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...
         }
      

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        当我们进行构建时,我们将 SVN 配置替换为生产配置,我们还将连接字符串完全基于所有应用程序的 Web 服务,而不管状态如何指向拉动正确的 connection string Web 服务下来了。

        【讨论】:

        • 确实,这也是我们为网站所做的,但这是为了我的单元测试。我想我可以用同样的方法做,但这意味着很多工作。那么,这是我唯一的选择吗?
        • 我们按类别对连接字符串进行分组,例如:GetConnectionString("UnitTests","ReportsDB");在生产中:GetConnectionString("Production","ReportsDB");
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-02-27
            • 2014-01-19
            • 2016-01-26
            • 2020-12-12
            • 2011-05-15
            • 2012-08-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多