Tout d'abord, mon objectif principal est de configurer dynamiquement l'IP et le port pour mon application.
J'utilise IConfiguration
pour injecter un fichier de configuration json, comme certains tutoriels mentionnés.
Cependant, je ne peux pas récupérer la configuration dans Program.cs, car mon WebHostBuilder
utilisera le démarrage et l'URL en même temps.
Donc, au moment de la création de l'hôte, il n'y a rien dans ma 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();
Dans 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);
}
Mes appsettings.json:
{
"WebProtocolSettings": {
"Url": "127.0.0.1",
"Port": 5050
}
}
Mon WebProtocolSettings.cs:
public class WebProtocolSettings
{
public string Url { get; set; }
public int Port { get; set; }
}
Vous devez créer une configuration dans votre méthode principale, obtenir la section et la lier à votre modèle. Pas question.
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();
}
Une autre façon de le faire est de passer la configuration à UseConfiguration
comme décrit dans le
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();
}
ou dans 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();
}
.UseConfiguration
(Réponse alternative de Tseng) est le moyen le plus simple, mais notez que lorsqu'il est configuré de cette façon, les modifications apportées aux fichiers de configuration au moment de l'exécution ne sont pas appliquées à vos objets IConfiguration. Pour garder la configuration dynamique, vous devez utiliser .ConfigureAppConfiguration
- mais vous devez ensuite construire la configuration un temps supplémentaire pour l'utiliser dans Main()
. Vous pouvez cependant réutiliser le code qui le configure.
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);
}