Kestrel

发布时间 2023-05-17 16:21:31作者: 摧残一生

概述

  1. 微软推出的跨平台Web服务器,目前Asp.NET项目都支持Kestrel,而且是默认启用的。那可能有人会问,哪里用到了,答案就是这句代码:

    WebApplication.CreateBuilder(args); //调用Kestrel

  2. Kestrel利用KestrelEngine(网络引擎)实现对请求的监听,接受和响应,而KestrelEngine是基于libuv开发的,总体来说,就是一个进程内的高效Http Server。其支持以下方案:

    1. HTTPS
    2. HTTP/2(在 macOS† 上除外)
    3. 用于启用 WebSocket 的不透明升级
    4. 用于获得 Nginx 高性能的 Unix 套接字

配置

在非IIS环境下,Asp.Net项目默认使用的就是Kestrel,因此我们只需要对其进行相关配置即可,无需额外进行创建和引用。

var builder = WebApplication.CreateBuilder(args);
//WebHost中含有多中Http服务器
builder.WebHost.ConfigureKestrel(options =>
{
    // Http或Https请求最大并发数
    options.Limits.MaxConcurrentConnections = 100;
    // 非Http或Https请求,例如WebSocket,最大并发数,默认不受限制
    options.Limits.MaxConcurrentUpgradedConnections = 100;
    // 请求正文最大大小,默认30000000字节,越28.6MB
    /// 在中间件的设置
    /// context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = 10 * 1024;
    options.Limits.MaxRequestBodySize = 10 * 1024;
    // 请求正文最小数据速率 MinRequestBodyDataRate MinResponseDataRate
    options.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    // 请求正文最小数据速率 MinRequestBodyDataRate MinResponseDataRate
    options.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    //保持活动超时
    options.Limits.KeepAliveTimeout =
        TimeSpan.FromMinutes(2);
    // 请求头超时
    options.Limits.RequestHeadersTimeout =
        TimeSpan.FromMinutes(1);
    // 绑定到 TCP 套接字
    options.Listen(IPAddress.Loopback, 5000);
    options.Listen(IPAddress.Loopback, 5001, listenOptions =>
    {
        listenOptions.UseHttps("testCert.pfx", "testPassword");
    });
    // 每个连接的最大流 默认值是100
    options.Limits.Http2.MaxStreamsPerConnection = 100;
    // 标题表大小 默认值是4096
    options.Limits.Http2.HeaderTableSize = 4096;
    // 最大帧大小 默认值为 2^14 (16384)
    options.Limits.Http2.MaxFrameSize = 16384;
});