.NET core 中的Kestrel 服务器

什么是Kestrel?

Kestrel 是一个跨平台的Web服务器,会默认在ASP.NET Core 项目模板中对其进行配置。未使用 IIS 托管时,ASP.NET Core 项目模板默认使用 Kestrel。

Kestrel 的功能包括:

  • 跨平台:Kestrel 是可在 Windows、Linux 和 macOS 上运行的跨平台 Web 服务器。
  • 高性能:Kestrel 经过优化,可有效处理大量并发连接。
  • 轻量级:它经过优化,可在资源受限的环境(如容器和边缘设备)中运行。
  • 强化了安全性:Kestrel支持 HTTPS 并经过强化可抵御 Web 服务器漏洞。
  • 宽协议支持:Kestrel 支持常见的 Web 协议,包括:
    • HTTP/1.1、HTTP/2 和 HTTP/3
    • WebSockets
  • 与 ASP.NET Core 集成:与其他 ASP.NET Core 组件(例如中间件管道、依赖项注入和配置系统)无缝集成。
  • 灵活工作负载:Kestrel 支持许多工作负载:
    • ASP.NET 应用框架,例如最小 API、MVC、Razor 页、SignalR、Blazor 和 gRPC。
    • 使用 YARP 生成反向代理。
  • 扩展性:通过配置、中间件和自定义传输自定义 Kestrel。
  • 性能诊断:Kestrel 提供内置的性能诊断功能,例如日志记录和指标。

在下面的模板生成的 Program.cs 中,WebApplication.CreateBuilder 方法在内部调用 UseKestrel:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();app.MapGet("/", () => "Hello World!");app.Run();

一、终结点配置

ASP.NET Core 项目配置为绑定到 5000-5300 之间的随机 HTTP 端口和 7000-7300 之间的随机 HTTPS 端口。 所选端口存储在生成的 Properties/launchSettings.json 文件中,开发人员可以对其进行修改。 launchSetting.json 文件仅用于本地开发。

如果没有终结点配置,则 Kestrel 绑定到 http://localhost:5000

在 appsettings.json 中配置终结点

Kestrel 可以从 IConfiguration 实例加载终结点。 默认情况下,Kestrel 配置从 Kestrel 部分加载,终结点在 Kestrel:Endpoints 中配置:

{"Kestrel": {"Endpoints": {"MyHttpEndpoint": {"Url": "http://localhost:8080"}}}
}

上面的示例:

  • 使用 appsettings.json 作为配置源。 但是,可以使用任何 IConfiguration 源。
  • 在端口 8080 上添加名为 MyHttpEndpoint 的终结点。

在代码中配置终结点

KestrelServerOptions 提供用于在代码中配置终结点的方法:

  • Listen
  • ListenLocalhost
  • ListenAnyIP
  • ListenUnixSocket
  • ListenNamedPipe

如果同时使用 Listen 和 UseUrls API,Listen 终结点将覆盖 UseUrls 终结点。

Listen、ListenLocalhost 和 ListenAnyIP 方法绑定到 TCP 套接字:

var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{serverOptions.Listen(IPAddress.Loopback, 5000);serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");});
});

上面的示例:

  • 配置侦听端口 5000 和 5001 的终结点。
  • 使用 ListenOptions 上的 UseHttps 扩展方法为终结点配置 HTTPS。 有关详细信息,请参阅在代码中配置 HTTPS。

在 Windows 上,可以使用 New-SelfSignedCertificate PowerShell cmdlet 创建自签名证书。 有关不受支持的示例,请参阅 UpdateIISExpressSSLForChrome.ps1。

在 macOS、Linux 和 Windows 上,可以使用 OpenSSL 创建证书。

二、配置 HTTPS

Kestrel 支持使用 HTTPS 保护终结点。 通过 HTTPS 发送的数据使用传输层安全性 (TLS) 进行加密,以提高在客户端和服务器之间传输的数据的安全性。

HTTPS 需要 TLS 证书。 TLS 证书存储在服务器上,并将 Kestrel 配置为使用该证书。 应用可以在本地开发环境中使用 ASP.NET Core HTTPS 开发证书。 开发证书未安装在非开发环境中。 在生产环境中,必须显式配置 TLS 证书。 至少必须提供默认证书。

配置 HTTPS 和 TLS 证书的方式取决于终结点的配置方式:

  • 如果 URL 前缀或仅指定端口用于定义终结点,则仅当 HTTPS 终结点配置中提供了默认证书时,才能使用 HTTPS。 可以使用以下选项之一配置默认证书:
  • 在 appsettings.json 中配置 HTTPS
  • 在代码中配置 HTTPS

在 appsettings.json 中配置 HTTPS

Kestrel 可以使用默认 HTTPS 应用设置配置架构。 从磁盘上的文件或从证书存储中配置多个终结点,包括要使用的 URL 和证书。

任何未指定证书的 HTTPS 终结点(下例中的 HttpsDefaultCert)会回退至在 Certificates:Default 下定义的证书或开发证书。

以下示例适用于 appsettings.json,但可以使用任何配置源:

{"Kestrel": {"Endpoints": {"Http": {"Url": "http://localhost:5000"},"HttpsDefaultCert": {"Url": "https://localhost:5004"}}}
}

在代码中配置 HTTPS

上面已经介绍过,使用 Listen API 时,ListenOptions 上的 UseHttps 扩展方法可用于配置 HTTPS。

var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{serverOptions.Listen(IPAddress.Loopback, 5000);serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");});
});

ListenOptions.UseHttps 参数:

  • filename 是证书文件的路径和文件名,关联包含应用内容文件的目录。
  • password 是访问 X.509 证书数据所需的密码。
  • configureOptions 是配置 HttpsConnectionAdapterOptions 的 Action。 返回 ListenOptions
  • storeName 是从中加载证书的证书存储。
  • subject 是证书的主题名称。
  • allowInvalid 指示是否存在需要留意的无效证书,例如自签名证书。
  • location 是从中加载证书的存储位置。
  • serverCertificate 是 X.509 证书。

有关 UseHttps 重载的完整列表,请参阅 UseHttps。

三、为Kestrel 服务器配置选项

上面介绍过,要配置 Kestrel 配置选项,可以在 Program.cs 中调用 ConfigureKestrel:

var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel(serverOptions =>
{// ...
});

还可以从 appsettings.json 或 appsettings.{Environment}.json 文件配置 Kestrel :

{"Kestrel": {"Limits": {"MaxConcurrentConnections": 100,"MaxConcurrentUpgradedConnections": 100},"DisableStringReuse": true}
}

常用配置:

保持活动状态超时

KeepAliveTimeout 获取或设置保持活动状态超时:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});

将调试器附加到 Kestrel 进程时,不会强制实施此超时限制。

客户端最大连接数

MaxConcurrentConnections 获取或设置最大打开的连接数:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.MaxConcurrentConnections = 100;
});

MaxConcurrentUpgradedConnections 获取或设置最大打开、升级的连接数:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
});

升级的连接是已从 HTTP 切换到另一个协议(如 WebSocket)的连接。 连接升级后,不会计入 MaxConcurrentConnections 限制。

请求正文最大大小

MaxRequestBodySize 获取或设置允许的请求正文的最大大小(以字节为单位)。

以下示例为所有请求配置 MaxRequestBodySize

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.MaxRequestBodySize = 100_000_000;
});

在 ASP.NET Core MVC 应用中替代限制的推荐方法是在操作方法上使用 RequestSizeLimitAttribute 属性:

[RequestSizeLimit(100_000_000)]
public IActionResult Get()

以下示例在一个自定义中间件中使用 IHttpMaxRequestBodySizeFeature 为特定请求配置 MaxRequestBodySize

app.Use(async (context, next) =>
{var httpMaxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();if (httpMaxRequestBodySizeFeature is not null)httpMaxRequestBodySizeFeature.MaxRequestBodySize = 10 * 1024;// ...await next(context);
});

如果应用在开始读取请求后尝试配置请求的限制,则会引发异常。 使用 IHttpMaxRequestBodySizeFeature.IsReadOnly 属性检查设置 MaxRequestBodySize 属性是否安全。

请求正文最小数据速率

Kestrel 每秒检查一次数据是否以指定的速率(字节/秒)传入。 如果速率低于最小值,则连接超时。宽限期是 Kestrel 允许客户端将其发送速率提升到最小值的时间量。 在此期间不会检查速率。 宽限期有助于避免最初由于 TCP 慢启动而以较慢速率发送数据的连接中断。 最小速率也适用于响应。

MinRequestBodyDataRate 获取或设置请求正文的最小数据速率(以字节/秒为单位)。 MinResponseDataRate 获取或设置响应最小数据速率(以字节/秒为单位)。

以下示例为所有请求配置 MinRequestBodyDataRate 和 MinResponseDataRate

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));serverOptions.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});

请求标头超时

RequestHeadersTimeout 获取或设置服务器接收请求头所需的最大时间量:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});

HTTP/2 限制

该部分中的限制在 KestrelServerLimits.Http2 上设置。

每个连接的最大流

MaxStreamsPerConnection 限制每个 HTTP/2 连接的并发请求流的数量。 拒绝过多的流:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});

标题表大小

HeaderTableSize 限制了服务器上 HPACK 编码器与解码器可以使用的标头压缩表的大小(以八进制数表示)。 HPACK 解码器为 HTTP/2 连接解压缩 HTTP 标头:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.Http2.HeaderTableSize = 4096;
});

最大帧大小

MaxFrameSize 指示允许接收的最大帧有效负载的大小(以八进制数表示):

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.Http2.MaxFrameSize = 16_384;
});

最大请求标头大小

MaxRequestHeaderFieldSize 指示请求头字段序列的最大允许大小。 此限制适用于名称和值序列的压缩和未压缩表示形式:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});

初始连接窗口大小

InitialConnectionWindowSize 表示服务器一次愿意接收和缓冲多少请求正文数据,这些数据在每个连接的所有请求(流)中汇总:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.Http2.InitialConnectionWindowSize = 131_072;
});

请求也受 InitialStreamWindowSize 限制。

初始流窗口大小

InitialStreamWindowSize 表示服务器愿意为每个流一次接收和缓冲多少请求正文数据:

builder.WebHost.ConfigureKestrel(serverOptions =>
{serverOptions.Limits.Http2.InitialStreamWindowSize = 98_304;
});

请求也受 InitialConnectionWindowSize 限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始的源码搭建:详解连锁餐饮行业中的点餐小程序开发

时下&#xff0c;点餐小程序成为了许多餐饮企业引入的一种创新工具&#xff0c;不仅方便了顾客的用餐体验&#xff0c;同时也提高了餐厅的运营效率。本文将详细探讨如何从零开始搭建一个源码&#xff0c;并深入解析连锁餐饮行业中的点餐小程序开发过程。 一、需求分析与规划 在…

如何使用Flash模拟EEPROM

目录 1、FLASH与EEPROM简介 2、FLASH模拟EEPROM原理 2.1、EERPOM数据结构 2.2、EERPOM物理结构 在讲解这篇博文前&#xff0c;首先要明白为什么使用Flash存储来模拟EEPROM&#xff1f; 主要有以下几个原因&#xff1a; 成本效益&#xff1a;许多微控制器(MCU)和系统芯片(SoC)内…

统计学-R语言-4.2

文章目录 前言单变量数据的描述分析分类型数据频数表条形图饼图 数值型数据数值型数据数据的集中趋势--均值数据的集中趋势--众数 离散程度离散程度--极差离散程度--四分位数极差离散程度--方差离散程度--加权方差离散程度--标准差离散程度--变异系数 数据的形状数据的形状--偏…

高级分布式系统-第7讲 分布式系统的时钟同步

顺序的分类 在分布式系统中&#xff0c; 顺序关系主要分为以下三类&#xff1a;时间顺序&#xff1a; 事件在时间轴上发生的先后关系。 无限时刻集组成有向时间轴&#xff0c; 时间顺序是通过时刻的顺序体现的。 因果顺序&#xff1a; 如果事件e1是事件e2发生的原因&#xf…

数据分析概述2(详细介绍机器学习

目录 1.名词解释&#xff1a;1.1算法和模型1.2参数和超参数 2.基础算法&#xff1a;3.高级算法&#xff1a;4.数据准备5.常用python包小结&#xff1a; 1.名词解释&#xff1a; 1.1算法和模型 算法&#xff1a;用于训练模型的方法&#xff0c;分为有监督学习、无监督学习、半…

Logstash:迁移数据到 Elasticsearch

在生产环境中&#xff0c;不使用 Apache Kafka 等流平台进行数据迁移并不是一个好的做法。 在这篇文章中&#xff0c;我们将详细探讨 Apache Kafka 和 Logstash 的关系。 但首先让我们简单了解一下 Apache Kafka 的含义。 Apache Kafka 是分布式流平台&#xff0c;擅长实时数据…

anaconda创建虚拟环境启动jupyter notebook

1.进入虚拟环境 &#xff08;以环境名为py37_pytorch1.9为例&#xff09; 创建虚拟环境: conda create -n py37_pytorch1.9 python3.7 查看已经创建的虚拟环境&#xff1a; ​​​​​​​conda env list 切换/进入环境&#xff1a; conda activate py37_pytorch1.9 删除环…

C语言宏定义小技巧

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒&#xff08;除闰年&#xff09;举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

Fiddler怎么抓请求做接口

第一步:安装fiddler 可以在官网下载最新版本 VIP小伙伴可以在课前准备下载,如果已经安装,请忽略 打开fiddler开始抓取测试对象的请求,以教管系统登录为例 打开fiddler,准备开始抓取,清空会话,开启抓取状态,因为fiddler默认抓取http协议,所以这里不需要设置什么。 打开系统登…

通过 CMake 制作库文件 静态库 和 动态库

hehedalinux:~/Linux/loveDBTeacher-v2$ tree . ├── CMakeLists.txt ├── include │ └── head.h ├── main.c └── src├── add.c├── div.c├── mult.c└── sub.c CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库 …

【数据结构】二叉树问题总结

目录 1.二叉树前序遍历&#xff0c;中序遍历和后序的实现 2.层序遍历 3.求二叉树中的节点个数 4.求二叉树中的叶子节点个数 5.求二叉树的高度 6.求二叉树第k层节点个数 7.二叉树查找值为x的节点 8.单值二叉树 9.二叉树最大深度 10.翻转二叉树 11. 检查两颗树是否相同…

NetDevOps:华三交换机通过Netmiko或者Nornir获取接口信息通过TextFSM解析报错问题

python代码&#xff1a;实现功能获取交换机接口信息并通过TextFSM进行解析。 from netmiko import Netmiko import textfsm show_intf_cmd_mapping {hp_comware: display interface, }def ssh_device_2_get_intfs(device_type, host, username, password, port):dev_info {d…

【2023年度回顾】让我们在新的一年继续努力前行

每当我们在努力的时候都会想&#xff1a;为什么我要努力&#xff1f;躺着不舒服吗&#xff1f; 大家好&#xff01;我是命运之光&#xff0c;一名普普通通的计算机科学与技术专业的大三学生。 &#x1f4d5;回顾一下整个2023年 因为我有每天发朋友圈的习惯&#xff0c;所以这一…

chromedriver 114以后版本下载地址

谷歌浏览器版本经常会升级&#xff0c;chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 找到匹配浏览器版本 查看自己浏览器版本号v120.0 v120.0版本chromedriver下载地址https://google…

Ubuntu 22.04 安装prometheus

服务器监控和报警软件有很多&#xff0c;为什么我们会选择Prometheus而不是其他软件呢&#xff1f; 因为它有以下优点&#xff1a; 自带简易web监控页面&#xff0c;用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警&#xff1b;具有丰…

Java SPI在数据库驱动、SpringBoot自动装配中的应用

文章目录 1. 初识SPI1.1 SPI的作用1.2 SPI的工作原理1.3 SPI的三个组件&#xff1a;Service、Service Provider、ServiceLoader1.4 SPI使用场景1.5 具体的SPI 源码分析&#xff08;SPI的核心就是ServiceLoader.load()方法&#xff09;1.6 SPI 的优缺点 2. API、SPI、JNDI释义3.…

uniapp滑动页面切换和下拉刷新,触底加载更多(swiper + scroll-view)

因为官方文档乱七八糟的&#xff0c;所以自己来总结下 需求&#xff1a; 常见的上方tag标签切换&#xff0c;下方是页面&#xff0c;上面点击切换&#xff0c;下面页面也切换&#xff0c;下方列表有下拉刷新&#xff0c;触底加载更多 因为这两个组件都是固定高度的&#xff0c;…

6.2 声音编辑工具GoldWave5简介(6)

3&#xff0e;选择【选项】|【控制器属性】命名或单击“控制器”面板上的“设置控制器属性”按钮&#xff0c;打开“控制器属性”对话框&#xff0c;将“音量”选项卡中的“麦克风”选项打上勾&#xff0c;使GoldWave只能录制来自麦克风的声音。如果要录制电脑内部的声音&#…

聊天机器人之接收实时信息实现(二)

准备工作 如果没有准备好环境的请看 前期环境准备 这里默认已经注入成功并且已经登录好了账号。 具体实现 实现原理 通过本地搭建一个web服务&#xff0c;来接收一个POST请求&#xff0c;这个请求中就会涵盖实时的数据&#xff0c;包括昵称、消息内容、消息类型之类的。 p…

Head First Design Patterns -工厂模式

什么是工厂模式 工厂方法模式定义了一个创建对象的接口&#xff0c;但由子类来决定要实例化那个类。工厂方法让类把实例化推迟到了子类。 为什么要有工厂模式 书中以pizza店制作pizza为例子&#xff0c;假设不用工厂模式&#xff0c;在制作pizza阶段我们需要这样去实例化类&am…