您好,我需要在初始化appsettings
类之前使用Startup
(或另一个jsonfile),特别是在CreateWebHostBuilder
中调用的Program.Main
中。我想为应用程序设置UseUrls(url)
。
我想以某种方式在IConfiguration
类中使用Startup
时重用相同的资源。
如何实现呢?
public class Program {
public static void Main(string[] args) {
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
WebHostBuilder builder = new WebHostBuilder();
builder.UseStartup<Startup>();
//load the Port and Host from appsettings
var url =$"http://{appsettings.host}:{appsettings.port}/";
Debug.WriteLine(url);
builder.UseKestrel().UseUrls(url);
return builder;
}
}
答案 0 :(得分:1)
我知道@Ígor Krug和@ Tseng有两个不错的答案(我对这两个答案投了赞成票)。下面的解释仅是在评论中回答OP的问题。 (我试图发表评论,但是在评论中粘贴这么多单词太糟了)
我不明白:因此您在main方法中创建了一个Configuration,但是如何将其绑定到应用程序,以便以后可以在Startup中引用它?
如您所知,Startup
并不关心Configuration
的构造方式。如果要与主机构建器和应用程序(包括Startup
)共享配置,则有两种方法。
就像@ Tseng一样,只需调用.UseConfiguration(config)
。 .UseConfiguration
方法将为主机构建器指定一个配置,并且该配置将被应用程序重用。至于您的原始问题,请在您的urls:"https://your.host.name:port"
中添加一个appsettings.json
设置:
{
"urls": "http://localhost:8809",
...
}
,只需稍作更改即可复制Tseng's answer:
WebHostBuilder builder = new WebHostBuilder();
builder.UseStartup<Startup>();
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false)
// ...
.Build();
return builder
// the `config` will be reused by application (including Startup)
.UseConfiguration(config)
.UseKestrel();
或者,如果您想为应用程序(包括Startup
)添加单独的配置,则可以调用.ConfigureAppConfiguration(c=>{ /*...*/ })
。 这部分配置不会与主机制作者共享:
return builder
// .UseConfiguration(config)
.UseUrls(config["urls"])
.UseKestrel()
.ConfigureAppConfiguration(c =>{
c.AddConfiguration(config);
})