IWebHostBuilder.PreferHostingUrls 的目的是什么
What is the purpose of IWebHostBuilder.PreferHostingUrls
我知道 documentation 说的是什么,但我不知道 IServer 是从哪里引入的或如何配置的。
我的具体情况是我正在调用 IHostBuilder.ConfigureWebHost(不是 ConfigureWebHostDefaults),据我所知,它不会自动包含 Kestrel。我通过 UseHttpSys 使用 HttpSys 而不是使用 Kestrel。
当我同时 运行 两个本地开发网站时,我 运行 陷入了一个问题。尽管 lauchSettings 文件每个都有不同的端口,但它们都注册了端口 5000。当然,第二个站点收到一个错误,表明 5000 已被使用。经过大量探索,我发现 documentation 表明端口 5000 是所有东西的默认端口,而不仅仅是 Kestrel。 (我真的相信在 5.0 之前,只有 Kestrel 默认为 5000。)我通过在我的代码中显式设置一个 URL 来证明默认值并且它很荣幸并且没有访问 5000。然后我删除了代码并在 appSettings 文件中设置了 "urls": "http://localhost:6000" 并且它被接受了。在这一点上,我尝试了 true 和 false 作为 PreferHostingUrls 的参数,它们都使用了 appSettings 文件中配置的 url,并且都在 appSettings 或代码中没有显式 url 的情况下失败。
所以问题的一部分变成了什么是 IServer 以及它是如何引入和配置的。
两者都是 HostBuilder and IWebHostBuilder containing the UseUrls 方法,它是以分号分隔的 IP 地址或主机地址列表,其中包含服务器应侦听请求的端口和协议。通过使用此方法,我们可以设置服务器应侦听请求的URL,
此外,当我们将Asp.net核心应用配置为使用服务器(如Http.sys或Kestrel)时,我们还可以在服务器选项中设置URL服务器应该监听请求,例如使用 HttpSysOptions.UrlPrefixes Property or the KestrelServerOptions.Listen() method.
然后,使用 PreferHostingUrls
属性,我们可以指示主机是否应监听 IWebHostBuilder 上配置的 URL 或 IServer 上配置的 [=22] =]
示例代码如下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hostsettings.json", optional: true)
.AddCommandLine(args)
.Build();
return WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:5000")
.UseConfiguration(config)
.UseHttpSys(serveroptions =>
{
serveroptions.Authentication.Schemes = Microsoft.AspNetCore.Server.HttpSys.AuthenticationSchemes.None;
serveroptions.Authentication.AllowAnonymous = true;
serveroptions.MaxConnections = 100;
serveroptions.MaxRequestBodySize = 30000000;
serveroptions.UrlPrefixes.Add("http://localhost:5001");
})
//.ConfigureKestrel(serverOptions =>
//{
// serverOptions.Limits.MaxConcurrentConnections = 100;
// serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
// serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
// serverOptions.Limits.MinRequestBodyDataRate =
// new MinDataRate(bytesPerSecond: 100,
// gracePeriod: TimeSpan.FromSeconds(10));
// serverOptions.Limits.MinResponseDataRate =
// new MinDataRate(bytesPerSecond: 100,
// gracePeriod: TimeSpan.FromSeconds(10));
// serverOptions.Listen(IPAddress.Loopback, 5001);
// serverOptions.Limits.KeepAliveTimeout =
// TimeSpan.FromMinutes(2);
// serverOptions.Limits.RequestHeadersTimeout =
// TimeSpan.FromMinutes(1);
//})
.PreferHostingUrls(false)
.Configure(app =>
{
app.Run(context =>
context.Response.WriteAsync("Hello, World!"));
});
}
如果PreferHostingUrls
是false
,它监听5001端口:
如果 PreferHostingUrls
是 true
,它将监听 5000 端口:
参考:
我知道 documentation 说的是什么,但我不知道 IServer 是从哪里引入的或如何配置的。
我的具体情况是我正在调用 IHostBuilder.ConfigureWebHost(不是 ConfigureWebHostDefaults),据我所知,它不会自动包含 Kestrel。我通过 UseHttpSys 使用 HttpSys 而不是使用 Kestrel。
当我同时 运行 两个本地开发网站时,我 运行 陷入了一个问题。尽管 lauchSettings 文件每个都有不同的端口,但它们都注册了端口 5000。当然,第二个站点收到一个错误,表明 5000 已被使用。经过大量探索,我发现 documentation 表明端口 5000 是所有东西的默认端口,而不仅仅是 Kestrel。 (我真的相信在 5.0 之前,只有 Kestrel 默认为 5000。)我通过在我的代码中显式设置一个 URL 来证明默认值并且它很荣幸并且没有访问 5000。然后我删除了代码并在 appSettings 文件中设置了 "urls": "http://localhost:6000" 并且它被接受了。在这一点上,我尝试了 true 和 false 作为 PreferHostingUrls 的参数,它们都使用了 appSettings 文件中配置的 url,并且都在 appSettings 或代码中没有显式 url 的情况下失败。
所以问题的一部分变成了什么是 IServer 以及它是如何引入和配置的。
两者都是 HostBuilder and IWebHostBuilder containing the UseUrls 方法,它是以分号分隔的 IP 地址或主机地址列表,其中包含服务器应侦听请求的端口和协议。通过使用此方法,我们可以设置服务器应侦听请求的URL,
此外,当我们将Asp.net核心应用配置为使用服务器(如Http.sys或Kestrel)时,我们还可以在服务器选项中设置URL服务器应该监听请求,例如使用 HttpSysOptions.UrlPrefixes Property or the KestrelServerOptions.Listen() method.
然后,使用 PreferHostingUrls
属性,我们可以指示主机是否应监听 IWebHostBuilder 上配置的 URL 或 IServer 上配置的 [=22] =]
示例代码如下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hostsettings.json", optional: true)
.AddCommandLine(args)
.Build();
return WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:5000")
.UseConfiguration(config)
.UseHttpSys(serveroptions =>
{
serveroptions.Authentication.Schemes = Microsoft.AspNetCore.Server.HttpSys.AuthenticationSchemes.None;
serveroptions.Authentication.AllowAnonymous = true;
serveroptions.MaxConnections = 100;
serveroptions.MaxRequestBodySize = 30000000;
serveroptions.UrlPrefixes.Add("http://localhost:5001");
})
//.ConfigureKestrel(serverOptions =>
//{
// serverOptions.Limits.MaxConcurrentConnections = 100;
// serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
// serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
// serverOptions.Limits.MinRequestBodyDataRate =
// new MinDataRate(bytesPerSecond: 100,
// gracePeriod: TimeSpan.FromSeconds(10));
// serverOptions.Limits.MinResponseDataRate =
// new MinDataRate(bytesPerSecond: 100,
// gracePeriod: TimeSpan.FromSeconds(10));
// serverOptions.Listen(IPAddress.Loopback, 5001);
// serverOptions.Limits.KeepAliveTimeout =
// TimeSpan.FromMinutes(2);
// serverOptions.Limits.RequestHeadersTimeout =
// TimeSpan.FromMinutes(1);
//})
.PreferHostingUrls(false)
.Configure(app =>
{
app.Run(context =>
context.Response.WriteAsync("Hello, World!"));
});
}
如果PreferHostingUrls
是false
,它监听5001端口:
如果 PreferHostingUrls
是 true
,它将监听 5000 端口:
参考: