3.1.2 Kestrel

Kestrel是轻量级、托管的、开源且跨平台的Web服务器。它作为ASP.NET Core的组成部分,能够使ASP.NET Core应用程序运行在任何平台(如Windows和Linux操作系统等)上。在.NET Core之前的ASP.NET应用程序以IIS作为其服务器,并且与IIS有紧密的耦合关系,但ASP.NET Core则完全与IIS解耦,而ASP.NET Core之所以能够跨平台,也正是借助于Kestrel这个跨平台服务器。

当Kestrel作为ASP.NET Core的服务器时,它会在ASP.NET Core的进程内运行,并负责监听HTTP请求以及对每一次的请求返回HTTP响应,如图3-1所示。

图3-1 Kestrel服务器

除了让Kestrel服务器直接处理HTTP请求与响应外,还可以使用主流的Web服务器(如IIS和Apache等)放在Kestrel之前作为反向代理服务器(Reverse Proxy Server),从而使传来的HTTP请求经过并由反向代理服务器再传给Kestrel服务器,如图3-2所示。

图3-2 使用反向代理服务器

在实际生产环境部署应用程序时,这是常见且推荐的方式。因为借助于反向代理服务器,增加了应用程序的安全性,也提供了负载均衡、过滤请求和URL重定向等功能。

除了使用Kestrel作为服务器外,还可以使用HTTPSys,这两个都是ASP.NET Core内建的服务器。然而,HTTPSys只能运行在Windows平台上,但它却有Kestrel所不具有的一些特性,如Windows认证和端口共享等。

为了使用IIS作为反向代理服务器,我们使用IWebHostBuilder的UseIISIntegration扩展方法,这会使应用程序能够在IIS或IIS Express中运行。

另外,在图3-2中可以看到,当Kestrel收到HTTP请求后,它会将其转化为HttpContext,关于这一点,在3.2.2节中将会有更详细的讨论。

当使用dotnet run命令在控制台中运行程序时,应用程序的URL将会默认是http://localhost:5000https://localhost:5001;而当在Visual Studio中运行ASP.NET Core应用程序时,默认情况下,它会以IIS Express作为程序的宿主,此时访问程序的URL会是http://localhost:<随机端口>,以及https: //localhost:<随机端口>。如果要修改这个地址或端口,那么可以使用IWebHostBuilder接口的UseUrls方法,或者运行时使用命令行参数--urls,也可以在配置文件中添加配置项键名为urls,此外,还可以通过设置ASPNETCORE_URLS环境变量来改变。

在上一节中,我们已经看到了如何使用IWebHostBuilder接口的ConfigureKestrel方法来配置Kestrel服务器。