【问题标题】:.NET Core Web API: Automatically Loading Incorrect appsettings.json File.NET Core Web API:自动加载不正确的 appsettings.json 文件
【发布时间】:2019-03-12 20:24:31
【问题描述】:

我们有 .NET Core 2.2 Web API 项目,我们使用以下代码根据 DEBUGRELEASE 构建标志加载适当的 appsettings.json 文件。

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseConfiguration(new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
#if DEBUG
        .AddJsonFile("appsettings.Development.json")
#endif
#if RELEASE
        .AddJsonFile("appsettings.Production.json")
#endif
        .AddJsonFile("appsettings.json")
        .Build()
    )
    .UseStartup<Startup>()
    .Build();

我们创建了一个外部项目,它在 Topshelf Windows 服务项目中调用相同的方法。

奇怪的是appsettings.Production.json文件总是被加载,不管我们是在调试还是发布项目。

【问题讨论】:

  • appsettings.json 有什么价值?生产还是开发?

标签: c# asp.net-core .net-core appsettings


【解决方案1】:

查看CreateDefaultBuilder()的文档

备注

以下默认值应用于返回的 WebHostBuilder:

  • 使用 Kestrel 作为 Web 服务器并使用应用程序的配置提供程序对其进行配置,

  • 将 ContentRootPath 设置为 GetCurrentDirectory() 的结果,

  • appsettings.jsonappsettings.[EnvironmentName].json 加载IConfiguration,

  • 当 EnvironmentName 为“Development”时,使用入口程序集从 User Secrets 加载 IConfiguration,

  • 从环境变量加载 IConfiguration,

  • 从提供的命令行参数加载 IConfiguration,

  • 配置 ILoggerFactory 以记录到控制台并调试输出,

  • 并启用 IIS 集成。

该列表中的第 3 位始终会查看 ASPNETCORE_ENVIRONMENT 环境变量的值(如果未指定,则默认为“生产”),并尝试加载具有该名称的 appsettings 文件。

与其更改代码或使用预处理器指令,不如更改该环境变量的值(例如,更改为“开发”)。

这就是您的launchSettings.json 文件的工作方式:

"profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
  ...

不要与CreateDefaultBuilder() 争吵 - 您发布的代码执行了该方法已经为您执行的许多步骤(加载文件、设置基本路径等)。

这是在 ASP.Net Core 项目中为您提供的默认 Program.cs,它可以很好地为您工作:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

另外,请注意,您正在加载环境特定文件之前主 appsettings.json 文件。通常您会希望以其他顺序执行此操作。

【讨论】:

    【解决方案2】:

    然后执行以下操作并在托管系统操作系统中设置环境变量:

    var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    
    public static IWebHost BuildWebHost(string[] args) =>
      WebHost
        .UseConfiguration(new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
    
        .AddJsonFile($"appsettings.json", true, true)
        .AddJsonFile($"appsettings.{environmentName}.json", true, true)
    
        .Build()
      )
      .UseStartup<Startup>()
      .Build();
    

    编辑:删除 CreateDefaultBuilder()

    看看https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/#setting-up-app-configuration-in-configureappconfiguration

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2021-01-20
    • 2020-10-10
    相关资源
    最近更新 更多