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

Mat*_*vis 6 c# asp.net-core-mvc visual-studio-code asp.net-core asp.net-core-webapi

当我使用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();
}
Run Code Online (Sandbox Code Playgroud)

我不想用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();
Run Code Online (Sandbox Code Playgroud)

什么编译器错误?env在当前上下文中不存在.它只存在于Startup.cs文件中 - 在启动时不会调用,而是启动文件调用Program.cs,带有魔法.

那么,我该如何解决这个问题呢?我怎么能存储在我的我的环境特定的站点设置环境特有的appsettings.json,随后使用它,同时通过建立我的具体环境,虚拟主机WebHostBuilderProgram.cs

Jus*_*eno 8

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

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

"hostUrl": "http://*:<port number here>"
Run Code Online (Sandbox Code Playgroud)

使用以下内容修改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();
}
Run Code Online (Sandbox Code Playgroud)

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