Read appsettings.json in the Main Program.

First of all, my main goal is to configure the IP and port for my application dynamically.

I am using IConfiguration to enter the json configuration file, as mentioned in some tutorials.

However, I cannot get the configuration in Program.cs because my WebHostBuilder will use StartUp and Url at the same time.

So, during the assembly of the node, there is nothing in my configuration.

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

In 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); } 

My appsettings.json:

 { "WebProtocolSettings": { "Url": "127.0.0.1", "Port": 5050 } } 

My WebProtocolSettings.cs:

 public class WebProtocolSettings { public string Url { get; set; } public int Port { get; set; } } 
+20
source share
3 answers

You must create the configuration in your main method, get the section and bind it to your model. No way around.

 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(); } 

Update

An alternative way to do this is to pass the UseConfiguration configuration as described in

 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(); } 

or in 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(); } 
+34
source

.UseConfiguration (Tseng's alternative answer) is the easiest way, but note that with this setting, the changes made to the configuration files at run time do not apply to your IConfiguration objects. To save the dynamic configuration, you must use .ConfigureAppConfiguration but then you will need to create the configuration for use in Main() . However, you can reuse the code that sets it up.

ASP.NET Core 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); } 
0
source

Use this code:

 public class Program { private static string _environmentName; public static void Main(string[] args) { var webHost = BuildWebHost(args); var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile($"appsettings.{_environmentName}.json", optional: true, reloadOnChange: true) .AddCommandLine(args) .Build(); BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureLogging((hostingContext, config) => { config.ClearProviders(); _environmentName = hostingContext.HostingEnvironment.EnvironmentName; }).UseStartup<Startup>().Build(); } 
-2
source

Source: https://habr.com/ru/post/1014210/


All Articles