'Read appsettings.json in Main Program.cs
First of all my main purpose is to setup the IP and Port for my application dynamically.
I'm using IConfiguration to inject a json config file, like some tutorial mentioned.
However, I can't retrieve the configuration in Program.cs, because my WebHostBuilder will use the StartUp and Url at the same time.
So at the time the host build up, 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; }
}
Solution 1:[1]
In .NET 6
var builder = WebApplication.CreateBuilder(args);
var configValue = builder.Configuration.GetValue<string>("Authentication:CookieAuthentication:LoginPath");
Solution 2:[2]
.UseConfiguration (Tseng's alternative answer) is the simplest way, but note that when configured this way changes made to the configuration files at runtime are not applied to your IConfiguration objects. To keep the configuration dynamic you have to use .ConfigureAppConfiguration - but then you have to build the configuration an extra time for use in Main(). You can re-use the code that configures it, however.
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);
}
Solution 3:[3]
In asp.net core 3.1, you can access configuration through the hostContext. This sample is based on the Worker Service Project:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
//Access configuration here with the Host Context. For example, to get a connection string from AppSettings.json:
var connectionString = hostContext.Configuration.GetConnectionString("MyConnectionString");
services.AddHostedService<Worker>();
});
}
Solution 4:[4]
The method with the support for command line arguments and default appsettings files:
public static class Configuration
{
public static IConfigurationRoot BuildConfigurationRoot()
{
var args = Environment.GetCommandLineArgs();
var envArg = Array.IndexOf(args, "--environment");
var envFromArgs = envArg >= 0 ? args[envArg + 1] : null;
var aspnetcore = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var dotnetcore = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
var environment = envFromArgs ?? (string.IsNullOrWhiteSpace(aspnetcore)
? dotnetcore
: aspnetcore);
var configuration = new ConfigurationBuilder()
.AddCommandLine(Environment.GetCommandLineArgs())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(
$"appsettings.{environment}.json",
optional: true)
.Build();
return configuration;
}
}
Solution 5:[5]
"ConnectionStrings": { "OnlineStoreConnection": "Server=./SQLSERVER2017;Database=ReactOnlineStore;User Id=sa;Password=123456789" }
builder.Services.AddDbContext( optiosn => optiosn.UseSqlServer(builder.Configuration.GetConnectionString("OnlineStoreConnection")));
Solution 6:[6]
In .net core 3.1 you can use ConfigurationHelper.GetConfiguration() to get appSetting variables:
appSettings.json
"Endpoint": {
"ip": "170.888.88.888",
"port": 88888}
Program.cs
public class Program
{
public static void Main(string[] args)
{
var config = ConfigurationHelper.GetConfiguration();
var ip = config["Endpoint:ip"];
var port = config["Endpoint:port"];
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Sukesh Chand |
| Solution 2 | |
| Solution 3 | Greg Gum |
| Solution 4 | Stack Undefined |
| Solution 5 | Ata Hoseini |
| Solution 6 | Suman George |
