我有一个appsettings.json
文件,其中包含一些默认设置,只有一个localdb SQL Server连接字符串和一些日志记录设置。然后我有一个appsettings.Staging.json
文件,其中包含数据库的一些种子数据,没有连接字符串。我没有appsettings.Production.json
文件。
当我将ASP.NET核心项目发布到Azure时,我的配置文件被配置为在运行时使用Azure数据库连接字符串作为DefaultConnection。发布时,会在Azure服务器上创建一个appsettings.production.json
文件,其中包含Azure SQL连接字符串以及我在appsettings.json
文件中的其他设置,但是数据库已创建并且已播种基于appsettings.Staging.json
文件中的值。
服务器上的ASPNETCORE_ENVIRONMENT变量设置为" Staging":
> echo %ASPNETCORE_ENVIRONMENT%
D:\home\site\wwwroot
Staging
当我运行我的应用程序时,它使用Azure SQL服务器数据库,其连接字符串仅存在于appsettings.production.json
中。
所以我的问题是:当ASPNETCORE_ENVIRONMENT变量设置为Staging时,为什么要使用Production配置中的Connection String?如何清楚地使用Production和Staging配置文件中的设置? ASP.NET Core加载如下配置:
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
所以我不知道如何使用appsettings.json
和appsettings.Staging.json
以外的任何设置。
答案 0 :(得分:2)
在ASP.NET Core 2中使用CreateDefaultBuilder
创建的默认WebHostBuilder
带有许多良好的默认值。其中之一是应用程序配置:
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
因此,它首先会添加appsettings.json
和appsettings.{environmentName}.json
个文件。然后,如果当前环境是开发环境,它还将加载用户机密。然后,它将添加环境变量,最后它将添加命令行参数(如果在应用程序启动时提供了任何参数)。
设置方式,添加环境变量以便能够在JSON文件中覆盖配置。这样做尤其如此,对于生产环境,配置文件在配置文件中不可见,但在进程启动时可以更隐蔽地指定为环境变量。
特别是对于Azure,这通常是Azure SQL数据库的配置方式。因此,在您的情况下,很可能不是正在读取JSON文件的生产配置,而是Azure通过环境变量提供连接字符串。