我想问一下是否有一种方法可以告诉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;"
}
}
答案 0 :(得分:0)
不应在代码中指定特定于环境的配置。 ASP.NET Core具有一种机制,允许您根据运行的环境换出配置。
在开发应用程序时,通常会在Development
环境中运行。在将应用程序部署到生产环境时,默认使用Production
环境。但是,如果您有其他环境,也可以完全为这些环境组成新的名称,并为其指定特定的配置。 Environments chapter of the documentation
允许您执行的环境是创建多个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
。 user secrets chapter中对此进行了描述。
最佳做法是,尽管如此,还是完全避免在配置文件中完全使用连接字符串,因为您希望避免碰巧能够访问您的配置文件的人员(例如通过源代码)知道数据库的密码。在这种情况下,您可以使用其他本地机制,例如environment variables。
在您的情况下,您仅使用集成安全性,因此依赖于当前用户的凭据,这不是什么大问题。您唯一泄漏的是数据库名称。 –因此,您绝对可以从将连接字符串放入appsettings文件中开始。
例如,这就是您在启动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;"
}
}