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

How are configuration settings being loaded for ASP.NET Core on Azure?

我有一个 appsettings.json 文件,里面有一些默认设置,只有一个 localdb SQL 服务器连接字符串和一些日志记录设置。然后我有一个 appsettings.Staging.json 文件,其中包含一些数据库的种子数据,但没有连接字符串。我没有 appsettings.Production.json 文件。

当我将 ASP.NET 核心项目发布到 Azure 时,我的配置文件被配置为在 运行 时使用 Azure 数据库连接字符串作为默认连接。当我发布时,会在 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 变量设置为暂存时,为什么使用生产配置中的连接字符串?以及如何清楚地使用生产和暂存配置文件中的设置? ASP.NET 核心加载这样的配置:

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

所以我看不出它如何使用 appsettings.jsonappsettings.Staging.json 以外的设置。

在 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 通过环境变量提供连接字符串。