ASP.NET Core 2.0 : 五.服务是如何加载并运行的, Kestrel、配置与环境
"跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同?
本章从"宏观"到"微观"地看一下它的结构以及不同时期都干了些什么.
本章主要内容如下:
ASP.NET Core 的运行机制: "宏观"的看一下Http请求的处理流程.
ASP.NET Core 的配置与运行: 2倍放大后的ASP.NET Core Application, Kestrel服务器、启动与配置
ASP.NET Core 的环境变量.
ASP.NET Core 的运行机制
图1
ASP.NET Core 的运行机制如上图所示, 现在做一下详细说明.
①Web Server: ASP.NET Core提供两种服务器可用, 分别是Kestrel和HTTP.sys(Core 1.x 中被命名为 WebListener),
A. Kestrel是一个跨平台的Web服务器;
B. HTTP.sys只能用在Windows系统中.
②Internet: 当需要部署在Internal Network 中并需要 Kestrel 中没有的功能(如 Windows 身份验证)时,可以选择HTTP.sys。
③IIS、Apache、Nginx: Kestrel 可以单独使用 ,也可以将其与反向代理服务器(如 IIS、Nginx 或 Apache)结合使用。 请求经这些服务器进行初步处理后转发给Kestrel(即图中虚线的可选流程).
大概的运行机制就是这样, 那么具体到ASP.NET Core Application是如何运行的呢? 我们将图1中ASP.NET Core Application这个红框框放大一下,看下一节.
ASP.NET Core 的启动
看一下将图1的ASP.NET Core Application放大后的样子:
图2
④Main方法, 程序的起点.
⑤创建并配置WebHostBuilder: 首先调用CreateDefaultBuilder( 如图所示, 它是一系列配置的大综合,下文做详细介绍), 进行一系列配置之后, 调用 UseStartup<T>(),
指定⑩Startup为启动配置文件. 在Startup中, 将进行两个比较重要的工作, ⑧服务的依赖注入和⑨配置管道, 后文将对这一部分详细的介绍.
⑥生成WebHostBuilder并进行了一系列配置之后, 通过这个WebHostBuilder来Build出一个IWebHost.
⑦调用IWebHost的Run方法使之开始运行.
ASP.NET Core 应用程序本质上是控制台应用程序,所以它也是以一个我们熟悉的Main方法作为程序的起点.
打开Program.cs文件, 默认是如下代码
public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build(); }
定义了一个BuildWebHost方法, 在Main中调用它返回一个IWebHost, 并使这个IWebHost"Run起来". 再看BuildWebHost方法内部, 通过调用CreateDefaultBuilder
创建了一个IWebHostBuilder, 然后用这个Builder来Build出一个IWebHost.
简单来说就是 创建IWebHostBuilder=>Builder=>Build()=>IWebHost=>Run().
WebHostBuilder的一系列配置
系统离不开各种各样的配置, 比如常见的读取配置文件, 指定日志处理程序等, 我们详细的看一下.
CreateDefaultBuilder
CreateDefaultBuilder, 顾名思义, 它是一个默认配置 . 如图2所示, 它主要是调用了各种ConfigureXXX和UseXXX, 首先看一下它的源码
1 public static IWebHostBuilder CreateDefaultBuilder(string[] args) 2 { 3 var builder = new WebHostBuilder()