阅读Main Program.cs中的appsettings.json

Jac*_*cky 29 c# asp.net-core asp.net-core-1.0

首先,我的主要目的是动态地为我的应用程序设置IP和端口.

我正在使用IConfiguration注入一个json配置文件,就像一些教程提到的那样.

但是,我无法在Program.cs中检索配置,因为我WebHostBuilder将同时使用StartUp和Url.

所以在主机建立时,我的配置中没有任何内容.

WebProtocolSettings settings_Web = new WebProtocolSettings();
var host = new WebHostBuilder()
                .UseIISIntegration()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .UseUrls(settings_Web.Url + ":" + settings_Web.Port)
                .Build();
Run Code Online (Sandbox Code Playgroud)

在Startup.cs中

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

    Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; set; }

public void ConfigureServices(IServiceCollection services)
{
    // Adds services required for using options.
    services.AddOptions();

    var _WebProtocolSettings = Configuration.GetSection("WebProtocolSettings");

    // Register the IConfiguration instance
    services.Configure<WebProtocolSettings>(_WebProtocolSettings);
}
Run Code Online (Sandbox Code Playgroud)

我的appsettings.json:

{
    "WebProtocolSettings": {
        "Url": "127.0.0.1",
        "Port": 5050
    }
}
Run Code Online (Sandbox Code Playgroud)

我的WebProtocolSettings.cs:

public class WebProtocolSettings
{
    public string Url { get; set; }
    public int Port { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Suk*_*and 126

在.NET 6中

var builder = WebApplication.CreateBuilder(args);

// Using the GetValue<type>(string key) method
var configValue = builder.Configuration.GetValue<string>("Authentication:CookieAuthentication:LoginPath");

// or using the index property (which always returns a string)
var configValue = builder.Configuration["Authentication:CookieAuthentication:LoginPath"];
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,正是我需要的。应该位于顶部,因为大多数其他答案都已过时。 (9认同)
  • 也写为`var configValue = builder.Configuration["Authentication:CookieAuthentication:LoginPath"];` (4认同)

Tse*_*eng 40

您必须在main方法中构建配置,获取该部分并将其绑定到您的模型.没办法解决它.

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", optional: false)
        .Build();

    WebProtocolSettings settings_Web = new WebProtocolSettings();
    config.GetSection("WebProtocolSettings").Bind(settings_Web);

    var host = new WebHostBuilder()
            .UseIISIntegration()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseUrls(settings_Web.Url + ":" + settings_Web.Port)
            .Build()

    host.Run();
}
Run Code Online (Sandbox Code Playgroud)

更新

另一种方法是将配置传递给UseConfiguration如下所述

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", optional: true)
        .AddCommandLine(args)
        .Build();

    var host = new WebHostBuilder()
        .UseUrls("http://*:5000")
        .UseConfiguration(config)
        .UseKestrel()
        .Configure(app =>
        {
            app.Run(context => 
                context.Response.WriteAsync("Hello, World!"));
        })
        .Build();

    host.Run();
}
Run Code Online (Sandbox Code Playgroud)

或者在ASP.NET Core> 2.0中

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", optional: true)
        .AddCommandLine(args)
        .Build();

    return WebHost.CreateDefaultBuilder(args)
        .UseUrls("http://*:5000")
        .UseConfiguration(config)
        .Configure(app =>
        {
            app.Run(context => 
                context.Response.WriteAsync("Hello, World!"));
        })
        .Build();
}
Run Code Online (Sandbox Code Playgroud)

  • @Tseng如果由于拥有特定于环境的hosting.json文件而需要访问hostingContext.HostingEnvironment.EnvironmentName,该怎么办? (3认同)

EM0*_*EM0 6

.UseConfiguration(Tseng 的替代答案)是最简单的方法,但请注意,以这种方式配置时,在运行时对配置文件所做的更改不会应用于您的 IConfiguration 对象。要保持配置动态,您必须使用.ConfigureAppConfiguration- 但是您必须额外时间构建配置以在Main(). 但是,您可以重用配置它的代码。

ASP.NET 核心 2.2:

    public static void Main(string[] args)
    {
        IConfigurationBuilder configBuilderForMain = new ConfigurationBuilder();
        ConfigureConfiguration(configBuilderForMain);
        IConfiguration configForMain = configBuilderForMain.Build();

        // ... use configForMain to read config here ...

        var host = new WebHostBuilder()
            .ConfigureAppConfiguration(ConfigureConfiguration)
            // ... the rest of it ...
            .Build();
    }

    public static void ConfigureConfiguration(IConfigurationBuilder config)
    {
        config.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    }
Run Code Online (Sandbox Code Playgroud)