首页 > 解决方案 > 本地和托管服务器的两个连接字符串

问题描述

我想问是否有办法告诉 ASP.NET Core 2 选择不同的连接字符串。

appsettings.json每次我将我的网站发布到托管服务器时,不断更改文件中的连接字符串是很烦人的。

我正在使用此代码来获取连接字符串。

 services.AddDbContext<AppIdentityDbContext>(options => 
     options.UseSqlServer(Configuration["Data:WebDataBase:ConnectionString"]));

也许有一种简单的方法,但我正在考虑在我的 Startup.cs 中使用 if 语句:

if (local) {
    services.AddDbContext<AppIdentityDbContext>(options => 
        options.UseSqlServer(Configuration["Data:WebDataBase1:ConnectionString"]));
}
else {
    services.AddDbContext<AppIdentityDbContext>(options => 
        options.UseSqlServer(Configuration["Data:WebDataBase2:ConnectionString"]));
}

local但是,无论服务器是我的本地计算机还是实时托管服务器,如何设置此变量?

"Data": {
  "WebDataBase1": {
    "ConnectionString": "Data Source=DatasoruceName;Initial Catalog=DBname;Trusted_Connection=True;Integrated Security=True;"
  },

  "WebDataBase2": {
    "ConnectionString": "Data Source=DatasoruceName;Initial Catalog=DatabaseName;Trusted_Connection=True;Integrated Security=True;"
  }
}

标签: c#.netasp.net-coreasp.net-core-2.0asp.net-core-configuration

解决方案


不应该在代码中指定特定于环境的配置。ASP.NET Core 有一种机制,允许您根据运行的环境更换配置。

在开发应用程序时,您通常在Development环境中运行。当您为生产部署应用程序时,Production默认使用环境。但是,如果您有其他环境,您也完全可以为这些环境编造新名称并为它们进行特定配置。这一切都在文档的环境章节中进行了解释

环境允许您做的是创建多个appsettings.json文件。默认情况下,ASP.NET Core 带有两个文件:appsettings.jsonappsettings.Development.json.

前者应该包含环境非特定配置;适用于所有环境的东西。后一个文件包含特定于开发的配置,例如调整日志记录级别,以便您在开发期间获得更多信息。您还可以使用这些文件appsettings.jsonappsettings.Development.json.

此外,配置文件遵循一个非常简单的模式:appsettings.<Environment>.json. 所以如果你在Production环境中运行,一个名为的文件appsettings.Production.json如果存在就会被加载。此机制允许您以不同方式配置所有环境,而无需在代码中进行检测。

此外,在开发过程中还有用户机密的概念。这些用于特定于开发的配置,这些配置仅适用于您自己,但不适用于您团队的其他成员。这基本上是每台机器的配置,允许您同时覆盖appsettings.jsonappsettings.Development.json. 这在用户机密一章中有描述。

最佳实践是完全避免在配置文件中使用连接字符串,因为您希望避免碰巧有权访问您的配置文件(例如通过您的源代码)的人知道您的数据库的密码。在这种情况下,您可以使用其他机制,例如进程本地的环境变量。


在您的情况下,您只是使用集成安全性,因此依赖当前用户的凭据,这不是什么大问题。您唯一泄漏的是数据库名称。– 因此,您绝对可以从将连接字符串放入 appsettings 文件开始。

因此,例如,这是您在 Startup 中配置数据库上下文的方式ConfigureServices

services.AddDbContext<AppIdentityDbContext>(options => 
    options.UseSqlServer(Configuration.GetConnectionString("WebDataBase"));

appsettings.Development.json看起来像这样:

{
  "ConnectionStrings": {
    "WebDataBase": "Data Source=DatasourceName;Initial Catalog=DBname;Trusted_Connection=True;Integrated Security=True;"
  }
}

appsettings.Production.json看起来像这样:

{
  "ConnectionStrings": {
    "WebDataBase": "Data Source=DatasourceName;Initial Catalog=DatabaseName;Trusted_Connection=True;Integrated Security=True;"
  }
}

推荐阅读