有没有办法覆盖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中)。
答案 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。这样您就不必担心更改任何内容,因为它们都是在服务器上存储/管理的。您现在可以无忧无虑地推送新版本,确保所有连接字符串保持与最初设置的相同。