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

7

当我在使用VS Code进行本地开发时,我会使用端口3000,因为我是个时髦的人。而那些不太时髦的人希望它在服务器上使用8080端口。没问题,这很简单。微软文档给了我以下示例:

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构建特定于环境的Web主机时使用Program.cs中的设置?

你可以使用launchSettings.json来实现这个功能。 - Lutando
使用VSCode,但希望在任何情况下都有IDE无关的解决方案。 - Matthew James Davis
2个回答

8
这是可能的。在程序.cs中创建WebHostBuilder和ConfigurationBuilder,可以访问主机环境,然后在特定于环境的appsettings文件中配置主机URL和端口,这进一步解释了这里给出的答案。
假设有一个appsettings.json文件和一个apppsettings.Development.json文件,每个文件都包含以下内容:
"hostUrl": "http://*:<port number here>"

请按照以下方式修改主要内容:

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 属性。

env 始终返回 Development。 - Assaf S.

0
或者,从.NET Core 2.0 开始,在创建将构建 IWebHost 实现的默认 IWebHostBuilder 时,您可以使用。
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>();

2
但是你如何在 UseUrls 中访问 config - Assaf S.
在 .NET Core 2 中,您可以像这样在 Kestrel 设置中设置监听端口:.ConfigureKestrel((context, options) => { var port = context.Configuration.GetSection("port").Value; options.Listen(IPAddress.Any, int.Parse(port)); }) - Rtype

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接