我尝试使用ASP.NET Core 2.0通过appsettings.json中的设置配置Kestrel端点的新方法。这在Microsoft Build 2017活动中得到了证明(见YouTube时间框架21:00-26:20)。
发言者说(并证明)以下内容将配置Kestrel上的侦听端口:
{
"Message": "TEST!!",
"Kestrel": {
"Endpoints": {
"Localhost": {
"Address": "127.0.0.1",
"Port": "5011"
}
}
}
}
但这对我没有用。当我使用' dotnet run'时,仍然使用默认端口5000。我知道正在加载appsettings.json文件,因为我可以在别处使用Message值。
从GitHub上的代码中,我看不到任何正在配置Kestrel的地方。
是否有其他人能够使用此方法?我无法理解它在演示中的工作原理,但不能理解我自己的代码。
答案 0 :(得分:1)
我知道这个问题是前一段时间提出的,但是我认为将其发布在上面是很有意义的,因为自最初提出此问题以来,ASP.NET Core框架已得到增强,可以从应用程序设置中支持Kestrel端点配置。 请在下面找到更多详细信息,以及有关如何在ASP.NET Core 2.1和更早版本中实现该功能的简要概述。
如documentation中所述,可以从ASP.NET Core 2.1版开始在应用程序设置中配置Kestrel端点。
有关更多详细信息,可以检入实际的WebHost.CreateDefaultBuilder()实现:
从版本2.1开始,它将加载Kestrel
配置部分,而在ASP.NET Core早期版本中,在设置UseKestrel()
时必须显式调用WebHost
。
ASP.NET Core 2.1设置
在ASP.NET Core 2.1上,您可以通过简单地提供以下http://127.0.0.1:5011
来设置Kestrel以监听appsettings.json
:
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://127.0.0.1:5011"
}
}
}
}
请注意,您将需要使用Url
而不是Address
和Port
。
ASP.NET Core 2.0设置
在ASP.NET Core 2.0上,可以通过在UseKestrel()
中显式调用Program.cs
来实现相同的行为。您可以使用扩展方法来保持Program.cs
的整洁:
public class Program {
public static void Main(string[] args) {
// configuration
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true)
.AddCommandLine(args)
.Build();
// service creation
var webHost = WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrelEndpoints(config) // extension method to keep things clean
.UseConfiguration(config)
.UseApplicationInsights()
.Build();
webHost.Run();
}
}
UseKestrelEndpoints()
是一种扩展方法,用于查看实际的配置设置并相应地设置Kestrel选项:
public static IWebHostBuilder UseKestrelEndpoints(this IWebHostBuilder webHostBuilder, IConfiguration configuration) {
var endpointSection = configuration.GetSection("kestrel:endpoints");
if (endpointSection.Exists()) {
webHostBuilder.UseKestrel(options => {
// retrieve url
var httpUrl = endpointSection.GetValue<string>("http:url", null);
/* setup options accordingly */
});
}
return webHostBuilder;
}
如果需要,您可以通过类似的方式setup HTTPS。
答案 1 :(得分:0)
不幸的是,它不再起作用了。查看How to use Kestrel in ASP.NET Core apps。所以它不再适用于设置。你可以在program.cs中做这样的事情。我在这里设置了在本地使用https,但你得到了一般的想法...
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
IHostingEnvironment env = null;
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((hostingContext, config) =>
{
env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.UseKestrel(options =>
{
if (env.IsDevelopment())
{
options.Listen(IPAddress.Loopback, 44321, listenOptions =>
{
listenOptions.UseHttps("testcert.pfx", "ordinary");
});
}
else
{
options.Listen(IPAddress.Loopback, 5000);
}
})
.Build();
}
}
}