c# - 本地和托管服务器的两个连接字符串
问题描述
我想问是否有办法告诉 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;"
}
}
解决方案
不应该在代码中指定特定于环境的配置。ASP.NET Core 有一种机制,允许您根据运行的环境更换配置。
在开发应用程序时,您通常在Development
环境中运行。当您为生产部署应用程序时,Production
默认使用环境。但是,如果您有其他环境,您也完全可以为这些环境编造新名称并为它们进行特定配置。这一切都在文档的环境章节中进行了解释
环境允许您做的是创建多个appsettings.json
文件。默认情况下,ASP.NET Core 带有两个文件:appsettings.json
和appsettings.Development.json
.
前者应该包含环境非特定配置;适用于所有环境的东西。后一个文件包含特定于开发的配置,例如调整日志记录级别,以便您在开发期间获得更多信息。您还可以使用这些文件appsettings.json
在appsettings.Development.json
.
此外,配置文件遵循一个非常简单的模式:appsettings.<Environment>.json
. 所以如果你在Production
环境中运行,一个名为的文件appsettings.Production.json
如果存在就会被加载。此机制允许您以不同方式配置所有环境,而无需在代码中进行检测。
此外,在开发过程中还有用户机密的概念。这些用于特定于开发的配置,这些配置仅适用于您自己,但不适用于您团队的其他成员。这基本上是每台机器的配置,允许您同时覆盖appsettings.json
和appsettings.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;"
}
}
推荐阅读
- jenkins - 在詹金斯构建中的一段时间后停止 JMeter 脚本
- powershell - Where-Object、Select-Object 和 ForEach-object - 区别和用法
- php - PHP包含来自另一个多个目录的文件
- javascript - 在饼图上使用 billboardjs 显示不带小数的百分比
- android - 在这种情况下我应该使用 FLAG_ACTIVITY_CLEAR_TOP 吗?如何使用 FLAG_ACTIVITY_CLEAR_TOP 意图标志?
- sql-server - SQL Server:从 XML 数据输出中的任意节点中选择特定值 - 已回答
- java - 来自 Spring-Boot 的高级 Rest 客户端 7.1.1:java.lang.NoSuchMethodError: org.elasticsearch.action.bulk.BulkRequest.pipeline()Ljava/lang/String;
- java - 无法将争论发送到 GoogleGson 的 FromJSON 方法
- javascript - 返回内部 $http 承诺
- apache-nifi - 在 Jolt 如何根据 jsonarray 值进行选择