ASPNET Core 2.x中的Kestrel服务器

来源:互联网 发布:天通金行情分析软件 编辑:程序博客网 时间:2024/05/21 14:44

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跨平台或扫描二维码关注

阅读全文
0 0