Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。
Kestrel支持以下功能:
HTTPS
用于启用不透明升级的WebSockets
位于Nginx之后的高性能Unix sockets
Kestrel 被.NET Core支持的所有平台和版本所支持
查看和下载示例代码
何时一起使用Kestrel和反向代理服务器?
ASP.NET CORE 2.x
你可以单独或者与反向代理服务器(如 IIS, Nginx, or Apache)一起使用Kestrel。反向代理从互联网接受HTTP请求,预处理后转发给Kestrel.
如果Kestrel仅暴露与内网中,有或没有反向代理的配置。
一个需要反向代理的场景是,你有多个需要在一个服务器上运行并共享同一端口的应用。因为Kestrel不支持在多进程间共享同一端口和同一个IP,在此情况下无法工作。当你配置Kestrel监听某个端口时,它会接管所有的流量,而不管主机标头是什么。反向代理可以共享出多个端口,然后转发给Ketrel的唯一IP和端口。
即时反向代理不是必须的,但在某些场景下,使用反向代理是一个更好的选择:
它可以限定你面对的网络区域.
它可以提供多一个附加层,以提供附加的的防护.
它可以更好地与现有架构集成。
使用它也可以简化负载均衡和SSL设置 -- 只要你的反向代理服务器需要SSL证书,并且该服务器可以和你的应用在内部网中通过普通HTTP进行通信。
如何在ASP.NET CORE APP中使用KESTREL
ASP.NET CORE 2.x
Microsoft.AspNetCore.Server.Kestrel 包已经包含在 Microsoft.AspNetCore.All metapackage中.
ASP.NET Core 工程模板缺省使用 Kestrel 。在 Program.cs中, 模板代码为 CreateDefaultBuilder
, 它用这句语句调用 UseKestrel :
public static void Main(string[] args) {BuildWebHost(args).Run(); }public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>().UseKestrel(options =>{options.Listen(IPAddress.Loopback, 5000);options.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");});}).Build();
如果你要配置Kestrel选项, 请在 Program.cs 如下例所示调用 UseKestrel
:
public static void Main(string[] args) {BuildWebHost(args).Run(); }public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() .UseKestrel(options => { options.Listen(IPAddress.Loopback, 5000); options.Listen(IPAddress.Loopback, 5001, listenOptions => { listenOptions.UseHttps("testCert.pfx", "testPassword"); }); }).Build();
Kestrel 选项
Kestrel web server有一些约束选项,做面对互联网的不是时会非常用用。下面是你能设置的一些限制条件:
最大连接客户数
最大请求体大小Maximum request body size
最小请求提数据率Minimum request body data rate
你需要在 KestrelServerOptions 类的Limits属性中设置这些约束 。 Limits
属性控制 KestrelServerLimits 类的实例.
最大连接客户数
参考一下代码:
.UseKestrel(options =>{ options.Limits.MaxConcurrentConnections = 100; options.Limits.MaxConcurrentUpgradedConnections = 100;options.Limits.MaxRequestBodySize = 10 * 1024;options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Listen(IPAddress.Loopback, 5000);options.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");}); })
Maximum request body size
缺省值为30,000,000byte, 大约是28.6MB。
在ASP .NET CORE MVC 的APP中,建议在action方法中使用 RequestSizeLimit 属性来重写它:
[RequestSizeLimit(100000000)]public IActionResult MyActionMethod()
下面是一个配置整个应用内每一个请求的Maximum request body size的例子:
.UseKestrel(options =>{options.Limits.MaxConcurrentConnections = 100;options.Limits.MaxConcurrentUpgradedConnections = 100; options.Limits.MaxRequestBodySize = 10 * 1024;options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Listen(IPAddress.Loopback, 5000);options.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");}); })
你也可以在一个中间件中设置特定请求的值:
app.Run(async (context) =>{ context.Features.Get<IHttpMaxRequestBodySizeFeature>() .MaxRequestBodySize = 10 * 1024 context.Features.Get<IHttpMinRequestBodyDataRateFeature>() .MinDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)); context.Features.Get<IHttpMinResponseDataRateFeature>() .MinDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
Kestrel的其他选项,参考下面的类:
KestrelServerOptions
KestrelServerLimits
ListenOptions
终端配置
缺省情况下,ASP.NET CORE绑定 http://localhost:5000. 通过在KestrelServerOptions上调用Listen 或者ListenUnixSocket方法可以配置Kestrel监听的URL和端口。(UseUrls, urls命令行参数,ASPNETCORE_URLS环境变量也能工作,定有一些限制,参考这里。
绑定到一个TCP socket
一下,Listen
方法绑定一个TCP socket, lumbda 选项配置一个SSL验证:
public static void Main(string[] args) {BuildWebHost(args).Run(); }public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() .UseKestrel(options => { options.Listen(IPAddress.Loopback, 5000); options.Listen(IPAddress.Loopback, 5001, listenOptions => { listenOptions.UseHttps("testCert.pfx", "testPassword"); }); }).Build();
请注意这个例子是如何用ListenOptions为部分终端配置SSL的。你可以用同一个API为部分终端配置其他Kestrel设置。
在windows系统中,你可以使用PowerShell的命令 New-SelfSignedCertificate生成自签名SLL证书,当然也有其他更好用的第三方工具生成你的自签名证书,如:
SelfCert
Makecert UI
在macOS 和 Linux你可以使用 OpenSSL创建自己的自签名证书。更多信息请参考 Setting up HTTPS for development.
绑定到Unix socket
You can listen on a Unix socket for improved performance with Nginx, as shown in this example:
.UseKestrel(options =>{options.ListenUnixSocket("/tmp/kestrel-test.sock");options.ListenUnixSocket("/tmp/kestrel-test.sock", listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testpassword");}); })
Port 0
如果你指定端口号为0, Kestrel 会动态绑定一个可用的端口.下面的例子显示如何找到Kestrel运行时实际绑定了哪个端口:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();app.UseStaticFiles();app.Run(async (context) =>{context.Response.ContentType = "text/html"; await context.Response.WriteAsync("<p>Hosted by Kestrel</p>"); if (serverAddressesFeature != null){ await context.Response .WriteAsync("<p>Listening on the following addresses: " + string.Join(", ", serverAddressesFeature.Addresses) + "</p>");} await context.Response.WriteAsync($"<p>Request URL: {context.Request.GetDisplayUrl()}<p>");}); }
UserUrsl的限制
IIS的终端配置
URL prefixes
原文地址:http://www.cnblogs.com/ccjungle/p/7514198.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注