まず、私の主な目的は、アプリケーションのIPとポートを動的にセットアップすることです。
前述のチュートリアルのように、json構成ファイルを挿入するためにIConfiguration
を使用しています。
ただし、WebHostBuilder
はStartUpとUrlを同時に使用するため、Program.csで構成を取得できません。
そのため、ホストが構築された時点では、私の構成には何もありません。
WebProtocolSettings settings_Web = new WebProtocolSettings();
var Host = new WebHostBuilder()
.UseIISIntegration()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseUrls(settings_Web.Url + ":" + settings_Web.Port)
.Build();
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);
}
私のappsettings.json:
{
"WebProtocolSettings": {
"Url": "127.0.0.1",
"Port": 5050
}
}
私のWebProtocolSettings.cs:
public class WebProtocolSettings
{
public string Url { get; set; }
public int Port { get; set; }
}
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();
}
それを行う別の方法は、設定を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();
}
または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
_(Tsengの別の答え)は最も簡単な方法ですが、この方法で構成すると、実行時に構成ファイルに加えられた変更がIConfigurationオブジェクトに適用されないことに注意してください。構成を動的に保つには、_.ConfigureAppConfiguration
_を使用する必要がありますが、Main()
で使用するために構成を余分に構築する必要があります。ただし、それを構成するコードを再利用できます。
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);
}
_