ASP.NET Core : 五.服务是如何加载并运行的, Kestrel、配置与环境

简介: "跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同?本章从"宏观"到"微观"地看一下它的结构以及不同时期都干了些什么.ASP.NET Core 的运行机制: "宏观"的看一下Http请求的处理流程. ASP.NET Core 的配置与运行: 2倍放大后的ASP.NET Core Application, Kestrel服务器、启动与配置ASP.NET Core 的环境变量.

ASP.NET Core 的运行机制

 image.jpeg

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放大后的样子:

1.png

④Main方法, 程序的起点.


⑤创建并配置WebHostBuilder: 首先调用Create­DefaultBuilder( 如图所示, 它是一系列配置的大综合,下文做详细介绍), 进行一系列配置之后, 调用 UseStartup(),


指定⑩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()

           .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()
 4         .UseKestrel()
 5         .UseContentRoot(Directory.GetCurrentDirectory())
 6         .ConfigureAppConfiguration((hostingContext, config) =>
 7         {
 8             var env = hostingContext.HostingEnvironment;
 9 
10             config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
11                   .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
12 
13             if (env.IsDevelopment())
14             {
15                 var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
16                 if (appAssembly != null)
17                 {
18                     config.AddUserSecrets(appAssembly, optional: true);
19                 }
20             }
21 
22             config.AddEnvironmentVariables();
23 
24             if (args != null)
25             {
26                 config.AddCommandLine(args);
27             }
28         })
29         .ConfigureLogging((hostingContext, logging) =>
30         {
31             logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
32             logging.AddConsole();
33             logging.AddDebug();
34         })
35         .UseIISIntegration()
36         .UseDefaultServiceProvider((context, options) =>
37         {
38             options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
39         });
40 
41     return builder;
42 }

上面的源码中我们看到它这些ConfigureXXX和UseXXX的过程, 而在Core 1.0版本中是没有CreateDefaultBuilder这个方法的,


系统默认是逐个调用这些ConfigureXXX和UseXXX的,在Core 2.0中, 为了代码简洁和使用方便, 将这些常规情况下需要调用的方法放到了这个名为CreateDefaultBuilder的方法中.


一般情况下,调用Create­DefaultBuilder 执行其中的这些的默认配置足够用了。但既然这是默认配置,  我们就可以根据自身情况自定义.


因为这些配置都是对 WebHostBuilder进行修改, 而修改后再次返回修改后的 WebHostBuilder, 所以在Create­DefaultBuilder不符合现实需求的情况下可以通过如下的方法进行自定义.


1)不调用Create­DefaultBuilder, 将上面讲到的这些配置选择性的执行, 甚至可以添加、替换里面的某些配置, 如将UseKestrel改为UseHttpSys.


2)小幅改动, 即调用Create­DefaultBuilder之后再对其返回的WebHostBuilder调用自定义的其他配置方法. 例如可以再次调用 ConfigureAppConfiguration,从而添加更多的配置源.


目录
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
23天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
20 1
|
1月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
86 9
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」
|
开发框架 前端开发 中间件
ASP.NET Core 核心特性学习笔记「上」
ASP.NET Core 核心特性学习笔记「上」
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
251 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
242 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
|
Cloud Native 架构师

热门文章

最新文章