在多个.NET应用程序中引用相同的连接字符串

时间:2018-11-30 20:11:08

标签: c# .net security connection-string

我不确定这是否是解决此问题的正确方法,所以如果不是,请通知我,我会纠正。

举例说明我的观点,假设我有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} }曾经需要更改连接字符串,然后我只需要在一个地方进行修改即可。

5 个答案:

答案 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>

来源: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-strings-and-configuration-files

答案 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)

一个不错的解决方案是在其他项目中添加配置文件快捷方式,因此您只需更新一个文件: enter image description here

这类似于共享程序集文件(在答案#2中显示:https://stackoverflow.com/a/15319582/495455

如果需要更多环境,请使用“变换”:

enter image description here

我知道这是一个简短的答案,我喜欢真正简单的解决方案。让我知道您是否有任何疑问。

答案 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.", "");
    }
}