我不确定这是否是解决此问题的正确方法,所以如果不是,请通知我,我会纠正。
举例说明我的观点,假设我有30个.NET应用程序发布到2-3个不同的Web服务器上。现在,这些应用程序是基于Intranet的,因此我在每个应用程序中都有一个C#库。该库由我在每个应用程序中使用的方法组成,以在必要时查找员工信息。现在,该库只有一个连接字符串,但是我还必须在所有30个应用程序中引用相同的连接字符串...因此,如果数据库更改了该库正在引用的内容,那么我必须记住所有30个应用程序并进行更改他们每个人都是单独的。
有没有一种方法可以将连接字符串放入某种文件(文本文件等)中,并使30个应用程序中的每个web.config都引用该特定文件,因此如果需要将连接字符串设置为更改后,我只需在文件中更改它,然后所有30个应用程序仍然可以,还是没有类似的东西?
更新
好的,我现在知道如何为连接字符串目的引用文本文件。.但是,看来我只能执行以下两种选择之一...要么引用我的主连接字符串和库连接字符串分别在web.config中,如下所示:
选项一
<connectionStrings>
<add name="PrimaryCS" // more data />
<add name="LibraryCS" // more data />
</connectionStrings>
此选项要求我更改30个应用程序中的每个LibraryCS
连接字符串(如果我不想更改)
选项2
<connectionStrings configSource="MyConfig.config"></connectionStrings>
此选项迫使我将两个连接字符串都放入MyConfig.config
文件中,而不仅仅是LibraryCS
文件中。.因此这将导致我不得不更改LibraryCS
30个应用程序中的每个MyConfig.config
文件中的连接字符串(再次,不是我想要的)。
我在寻找什么
我正在寻找两种选择的混合,但似乎无法完成,所以我希望这种介质上的某人知道解决方法
<connectionStrings configSource="MyConfig.config">
<add name="PrimaryCS" // more data />
</connectionStrings>
我希望MyConfig.config
文件仅保留LibraryCS
连接字符串,然后将主要的PrimaryCS
连接字符串分开..这样,如果{{1} }曾经需要更改连接字符串,然后我只需要在一个地方进行修改即可。
答案 0 :(得分:6)
Microsoft有一个很棒的文档。希望有帮助。
要将连接字符串存储在外部配置文件中,请创建 一个仅包含connectionStrings部分的单独文件。做 不包含任何其他元素,部分或属性。这个 该示例显示了外部配置文件的语法。
<connectionStrings>
<add name="Name"
providerName="System.Data.ProviderName"
connectionString="Valid Connection String;" />
</connectionStrings>
在主应用程序配置文件中,使用configSource 属性,用于指定标准名称和位置 外部文件。本示例引用外部配置文件 名为connections.config。
<?xml version='1.0' encoding='utf-8'?>
<configuration>
<connectionStrings configSource="connections.config"/>
</configuration>
答案 1 :(得分:1)
我想到的一个解决方案是创建一个共享的连接字符串文件,并在多个Web应用程序项目的web.config中引用它。
所以在我的Web配置中,我有这个:
<connectionStrings configSource="configs\connectionStrings.local.config">
此文件仅包含配置的“ connectionStrings”部分。
然后,我从一个常见的解决方案文件夹中将connectionStrings.local.config文件复制到项目构建中的configs文件夹中(该配置文件作为解决方案项添加到解决方案中。
其他选择是在服务器上使用环境变量来存储连接字符串,或者在人们提到一个公共文件时(就像读取任何文本文件一样读取文件)。
答案 2 :(得分:1)
您是否考虑过使用Apache Zookeeper?您的用例似乎符合其定义:
ZooKeeper是用于维护配置信息的集中式服务...
您可以在某处启动ZooKeeper实例,并在其中保留您的配置设置。您的设置将以类似于文件系统结构的结构进行组织。看起来可能像这样(例如,使用ZooKeeper随附的$('#FenceMeters').on('input', function() {
if($('#FenceMeters').val() != "" && Number($('#FenceMeters').val()) >=5){
$('#testje').show();
$('#SummaryHTML').hide();
} else{
$('#testje').hide(1000);
$('#SummaryHTML').show();
}
});
创建配置):
zkCli.sh
然后,您可以设置您的应用程序以包含ZooKeeper客户端,以便它们能够读取您存储的配置。对于.NET,我发现了https://github.com/shayhatsor/zookeeper,它似乎在模仿Java客户端:https://github.com/ewhauser/zookeeper。
我没有广泛使用它,但是我可以进行以下工作(注意C#7.1+,由于异步Main()):
create /common-settings
create /common-settings/connectionString 1.1.1.1:123
...
create /app-1-settings
create /app-1-settings/app-specific-setting myArbitrarySetting
我敢肯定,您可以轻松地使其适应您的特定需求。
要开始使用ZooKeeper,您可以研究他们的Getting Started。
当然,互联网上也有很多信息。
答案 3 :(得分:0)
一个不错的解决方案是在其他项目中添加配置文件快捷方式,因此您只需更新一个文件:
这类似于共享程序集文件(在答案#2中显示:https://stackoverflow.com/a/15319582/495455)
如果需要更多环境,请使用“变换”:
我知道这是一个简短的答案,我喜欢真正简单的解决方案。让我知道您是否有任何疑问。
答案 4 :(得分:0)
不知道这是否是您要搜索的内容,但是当您重载ApplicationDbContext的构造函数时,可以指定应使用的连接字符串:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base(GetConnectionStringName(), throwIfV1Schema: false)
{
}
static string GetConnectionStringName()
{
// Your logic for the connectionstring, I use the Request.Url here.
return HttpContext.Current.Request.Url.Authority.ToLower().Split(new char[] { ':' }).FirstOrDefault().Replace("www.", "");
}
}