使用appsettings来驱动特定于环境的设置,例如UseUrls

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用appsettings来驱动特定于环境的设置,例如UseUrls相关的知识,希望对你有一定的参考价值。

当我使用VS Code在本地开发时,我将使用端口3000,因为我是一个时髦的人。非赶时髦的人希望它在服务器上的端口8080上。那很酷,我们得到了这个。 Microsoft文档给出了以下示例:

public static void Main(string[] args)

    var config = new ConfigurationBuilder()
        .AddJsonFile("hosting.json", optional: true)
        .AddCommandLine(args)
        .Build();

    var host = new WebHostBuilder()
        .UseConfiguration(config)
        .UseKestrel()
        .Configure(app =>
        
            app.Run(async (context) => await context.Response.WriteAsync("Hi!"));
        )
        .Build();

    host.Run();

我不想使用hosting.json。我为什么要这样?我有这个appsettings.environment.json文件正是这种情况。甜蜜,我只是把那个坏孩子粘在里面

public static void Main(string[] args)

    var config = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true)
        .AddCommandLine(args)
        .Build();

什么编译器错误? env在当前背景下不存在。它只存在于Startup.cs文件中 - 在启动时不会被调用,而是从启动文件Program.cs调用,带有巫术。

那么,我该如何解决这个问题呢?如何在环境特定的appsettings.json中存储我的特定于环境的托管设置,然后在WebHostBuilder中通过Program.cs构建我的环境特定Web主机时使用它?

答案

这个有可能。扩展here给出的答案,通过在Program.cs中创建WebHostBuilder和ConfigurationBuilder,可以访问主机环境,然后在特定于环境的appsettings文件中配置主机URL和端口。

假设appsettings.json和apppsettings.Development.json文件各有以下内容:

"hostUrl": "http://*:<port number here>"

使用以下内容修改Main:

public static void Main(string[] args)

    var host = new WebHostBuilder();
    var env = host.GetSetting("environment");
    var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.env.json", optional: true)
        .AddEnvironmentVariables();
    var configuration = builder.Build();

    host.UseKestrel()
        .UseUrls(configuration["hostUrl"])
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .Build()
        .Run();

使用此代码,Startup.cs仍然需要声明自己的ConfigurationBuilder以公开其Configuration属性。

另一答案

或者,从.NET Core 2.0开始,在创建将构建IWebHostBuilder实现的默认IWebHost时,您可以使用

return WebHost.CreateDefaultBuilder(args)
            .UseConfiguration(configuration)
            .ConfigureAppConfiguration((builderContext, config) =>
            
                // nb: here you may clear configuration(s) loaded so far
                var env = builderContext.HostingEnvironment;
                config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appsettings.env.EnvironmentName.json", optional: false, reloadOnChange: true);
            )
            .UseStartup<Startup>();

以上是关于使用appsettings来驱动特定于环境的设置,例如UseUrls的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .Net 核心应用程序中发布特定于环境的应用程序设置?

DB 中的 AppSettings 而不是 App.Config

我的服务器设置正确的特定于语言环境的时区是不是重要? [复制]

Dotnet 不知道特定于环境的 appsettings 文件

将 NSString 转换为特定于语言环境的 NSNumber

如何为 dotenv 获取特定于环境的 .env 文件(在 Laravel 5 中)