【问题标题】:Use appsettings to drive environment specific settings such as UseUrls使用 appsettings 驱动特定于环境的设置,例如 UseUrls
【发布时间】:2017-09-01 10:46:31
【问题描述】:

当我使用 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 中,然后在通过 Program.cs 中的 WebHostBuilder 构建特定于环境的 Web 主机时使用它?

【问题讨论】:

  • 你可以使用 launchSettings.json 来驱动它。
  • 使用 vscode,但在任何一种情况下都希望有一个与 ide 无关的解决方案

标签: c# asp.net-core asp.net-core-mvc visual-studio-code asp.net-core-webapi


【解决方案1】:

或者,从 .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>();

【讨论】:

  • 但是如何在 UseUrls 中访问config
  • 在 .net core 2 中,您可以在 kestral 设置中设置监听端口,如下所示: .ConfigureKestrel((context, options) => { var port = context.Configuration.GetSection("port") .Value; options.Listen(IPAddress.Any, int.Parse(port)); })
【解决方案2】:

这是可能的。扩展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 属性。

【讨论】:

  • env 总是返回开发
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
相关资源
最近更新 更多