"跨平台"后的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: 首先调用Create­DefaultBuilder( 如图所示, 它是一系列配置的大综合,下文做详细介绍), 进行一系列配置之后, 调用 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的一系列配置

系统离不开各种各样的配置, 比如常见的读取配置文件, 指定日志处理程序等, 我们详细的看一下.

Create­DefaultBuilder

CreateDefaultBuilder, 顾名思义, 它是一个默认配置 . 如图2所示, 它主要是调用了各种ConfigureXXX和UseXXX, 首先看一下它的源码

复制代码
 1 public static IWebHostBuilder CreateDefaultBuilder(string[] args)  2 {  3     var builder = new WebHostBuilder()