如何为Azure上的ASP.NET Core加载配置设置?

时间:2018-01-19 23:59:49

标签: visual-studio azure asp.net-core appsettings

我有一个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.jsonappsettings.Staging.json以外的任何设置。

1 个答案:

答案 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.jsonappsettings.{environmentName}.json个文件。然后,如果当前环境是开发环境,它还将加载用户机密。然后,它将添加环境变量,最后它将添加命令行参数(如果在应用程序启动时提供了任何参数)。

设置方式,添加环境变量以便能够在JSON文件中覆盖配置。这样做尤其如此,对于生产环境,配置文件在配置文件中不可见,但在进程启动时可以更隐蔽地指定为环境变量。

特别是对于Azure,这通常是Azure SQL数据库的配置方式。因此,在您的情况下,很可能不是正在读取JSON文件的生产配置,而是Azure通过环境变量提供连接字符串。