1 关于asp.net core 的跨平台性
ASP.NET Core 的 Web 服务器默认采用Kestrel,这是一个跨平台、轻量级的Web服务器。
在开始之前,先回顾一下.NET Core 3.0默认的main()方法模板中,我们会调用Host.CreateDefaultBuilder方法,该方法的主要功能是配置应用主机及设置主机的属性,设置Kestrel 服务器配置为 Web 服务器,另外还包括日志功能、应用配置加载等等,此处不做展开。
作为一个轻量级的Web Server,它并没有IIS、Apache那些大而全的功能,但它依然可以单独运行,也可以搭配IIS、Apache等反向代理服务器结合使用。
下边从源码角度讨论ASP.NET Core应用在Kestrel的相关知识点。
2 什么是Kestrel?
什么是kestrel?查英文字典上字典上—— 红隼, 微软简介上说Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。 Kestrel 是 Web 服务器,默认包括在 ASP.NET Core 项目模板中。
.NET Core 支持的所有平台和版本均支持 Kestrel。github上存在 开源代码
在我看来:
kestrel是asp.net core 内置的webserve 也就是web服务器,asp.net core 以此来实现跨平台的目的
3 为什么要出现kestrel
因为.NET Core应用的目标就是跨平台,既然要跨平台那么就需要适用各个平台上的Web服务器,各个服务器的启动、配置等等都是不尽相同的,如果每个服务器提供一套实现出来,如果未来出现了一个新的Web Server,然后又要增加新的实现,这会导致.NET Core应用的适用性滞后,也会很消耗人力,无法很好的达到跨平台的目标。
我们可以把Kestrel视作一个中间件,一个适配的功能,它抽象了各个服务器的特性,使得各个应用只需要调用同样的接口,即可最大限度的在各个平台上运行。
4 何时结合使用 Kestrel 和反向代理
可以单独使用 Kestrel,也可以将其与反向代理服务器(如 Internet Information Services (IIS)、Nginx 或 Apache)结合使用。 反向代理服务器接收来自网络的 HTTP 请求,并将这些请求转发到 Kestrel。
Kestrel 用作边缘(面向 Internet)Web 服务器:
Kestrel 用于反向代理配置:
无论配置是否使用反向代理服务器,都是受支持的托管配置。
在没有反向代理服务器的情况下用作边缘服务器的 Kestrel 不支持在多个进程间共享相同的 IP 和端口。 如果将 Kestrel 配置为侦听某个端口,Kestrel 会处理该端口的所有流量(无视请求的 Host 标头)。 可以共享端口的反向代理能在唯一的 IP 和端口上将请求转发至 Kestrel。
即使不需要反向代理服务器,使用反向代理服务器可能也是个不错的选择。
反向代理:
可以限制所承载的应用中的公开的公共外围应用。
提供额外的配置和防护层。
可以更好地与现有基础结构集成。
简化了负载均和和安全通信 (HTTPS) 配置。 仅反向代理服务器需要 X.509 证书,并且该服务器可使用普通 HTTP 在内部网络上与应用服务器通信。
5.如何在 ASP.NET Core 应用中使用 Kestrel ?
在Microsoft.AspNetCore.App 元包中包括 Microsoft.AspNetCore.Server.Kestrel 包
默认情况下,ASP.NET Core 项目模板使用 Kestrel。 在 Program.cs 中,模板代码调用 CreateDefaultBuilder,后者在后台调用 UseKestrel。
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
……………………吃饭