.NET Core开发日志——从ASP.NET Core Module到KestrelServer

ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用。而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法生成一个WebHost类,最后启动之。

实现代码一目了然:

640?wx_fmt=png

要想探寻其内部究竟做了哪些操作,则需要调查下WebHost类中CreateDefaultBuilder静态方法:

640?wx_fmt=png

代码稍微有点多,但这里只关心WebHostBuilder类的创建,以及该builder使用了UseKestrel方法。

UseKestrel方法内部通过IoC的方式注入了KestrelServer类:

640?wx_fmt=png

由此可以知道当一个ASP.NET Core应用程序运行起来时,其内部会有KestrelServer。

那么为什么会需要这个KestrelServer?因为它可以做为一个反向代理服务器,帮助ASP.NET Core实现跨平台的需要。

以传统Windows系统上的IIS为例,如下图所示,ASP.NET Core应用程序中的代码已经不再直接依赖于IIS容器,而是通过KestrelServer这个代理将HTTP请求转换为HttpContext对象,再对此对象进行处理。

640?wx_fmt=png

图中的ASP.NET Core Module也是由ASP.NET Core的诞生而引入的新的IIS模块。它的主要功能是将Web请求重定向至ASP.NET Core应用程序。并且由于ASP.NET Core应用程序独立运行于IIS工作进程之外的进程,它还负责对进程的管理。

ASP.NET Core Module的源码由C++编写,入口是main文件中的RegisterModule函数。

其函数内部实例化了CProxyModuleFactory工厂类。

pFactory = new CProxyModuleFactory;

而由这个工厂类创建的CProxyModule实例中有一个关键的CProxyModule::OnExecuteRequestHandler方法。它会创建FORWARDING_HANDLER实例,并调用其OnExecuteRequestHandler方法。

640?wx_fmt=png

在此方法里就有那些核心的处理HTTP请求的操作。

640?wx_fmt=png

在ASP.NET Core应用程序这端,CreateWebHostBuilder(args).Build().Run();代码执行之后,会调用其对应的异步方法:

640?wx_fmt=png

该方法中又调用了WebHost的StartAsync方法:

640?wx_fmt=png

BuildApplication方法内部从IoC容器取出KestrelServer的实例:

640?wx_fmt=png

最后调用KestrelServer的StartAsync方法:

640?wx_fmt=png

到了这一步,KestrelServer终于可以监听来自ASP.NET Core Module发出的HTTP请求,而ASP.NET Core应用程序也可以开始其自身的任务处理了。

相关文章:

  • .Net Core开发日志——Global Tools

  • .Net Core开发日志——Peachpie

  • .NET Core开发日志——Middleware

  • .Net Core Cors中间件解析

  • .NET Core开发日志——Runtime IDentifier

原文地址https://www.cnblogs.com/kenwoo/p/9309264.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BZOJ5358: [Lydsy1805月赛]口算训练

题解:判断d是否整除,可以转化为求这段区间内d的因子的指数是否均大于d中的指数。容易想到把每个数字都分解为素因子形式,对每个素数出现的次数求个前缀和即可。然而,这样时间空间都不行。注意到对于一个数x,小于sqrt(x…

jzoj6800-NOIP2020.9.19模拟spongebob【枚举】

正题 题目链接:https://gmoj.net/senior/#contest/show/3222/0 题目大意 nnn个ai,bia_i,b_iai​,bi​,求一个xxx使得最小化∑i1n∣aixbi∣\sum_{i1}^n|a_ixb_i|i1∑n​∣ai​xbi​∣ 解题思路 每个∣aixbi∣|a_ixb_i|∣ai​xbi​∣可以视为一个分两段的函数&#…

【bfs】极其简单的最短路问题

极其简单的最短路问题 题目大意: 求最短路,权值只有1或2 原题: 题目描述 小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X的时间为1,由于有数…

GraphQL 的前世今生

GraphQL是什么GraphQL是一种新的API标准,它提供了一种更高效、强大和灵活的数据提供方式。它是由Facebook开发和开源,目前由来自世界各地的大公司和个人维护。GraphQL本质上是一种基于api的查询语言,现在大多数应用程序都需要从服务器中获取数…

jzoj6801-NOIP2020.9.19模拟patrick【树状数组】

正题 题目大意 nnn个连续的数,第iii个为hih_ihi​。有操作 给出一个HHH,询问大于等于HHH的数能组成多少个联通块修改一个位置的数。 解题思路 考虑计算连通块尾的数量,我们可以发现一个位置作为联通块尾部当且仅当hi≥Hh_i\geq Hhi​≥H且h…

Codeforces Round #485 (Div. 2)

Codeforces986B [Petr and Permutations] 看到两个随机的swap次数,很容易想到跟奇偶性有关。然后就凉了。赛后思考了一下,这个思路应该没问题,那就需要考虑swap的奇偶性与排列的关系。因此,我们考虑如何把两个不相邻数的swap&…

初一模拟赛总结(5.18)

成绩: rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf210210210505050606060303030707070111hkyhkyhky210210210100100100404040000707070333wjjwjjwjj190190190100100100000000909090444fyfyfy170170170100100100000000707070555tj…

Codeforces Round #486 (Div. 3)

E. Divisibility by 25 能被25整除的充要条件就是末两位是00,25,50,75。如果没有过程中不出现前导0这一限制,显然对每种情况,贪心取尽量低位即可。本题的关键就在于如何满足这个条件,首先有个”显然”的方法…

C#:如何将坏的代码重新编译为好的代码

自己的前言说明:本文原作者:Radoslaw Sadowski,原文链接为:C# BAD PRACTICES: Learn how to make a good code by bad example。本系列还有其他文章,后续将慢慢翻译。引言:我的名字叫Radoslaw Sadowski&…

P6855-「EZEC-4.5」走方格【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6855 题目大意 n∗mn*mn∗m的网格,每个格子有一个数,可以选择一个位置变为000。要求最小化最大权值和路径。 解题思路 考虑枚举哪个位置变为000,一个位置变为000后我们将路径分为两种路径…

【搜索树】高级打字机(luogu 1383)

高级打字机 luogu 1383 题目大意: 有三种操作:添加一个字符(更改操作),撤回前iii步步更改操作(更改操作,可以撤回自己),输出某一位的字符,现在要按要求输出…

AtCoder Grand Contest 025

B.RGB Coloring 绿色可以看作拿红和蓝都涂了&#xff0c;那么只需要满足A*a B*b K && 0 ≤ a,b ≤ n&#xff0c;答案加上C(n,a)*C(n,b) #include <bits/stdc.h> typedef long long ll; const ll mod 998244353; const int N 300000 100; using namespace s…

走进 Cake for .NET

一、什么是 CakeCake&#xff08;C# Make&#xff09; 是一个使用 C# DSL 面向 Task 的跨平台构建自动化系统&#xff0c;像编译代码&#xff0c;复制文件和文件夹&#xff0c;运行单元测试&#xff0c;压缩文件和构建 NuGet 包。更多内容请访问官网二、使用 Cake先尝试一下 P…

jzoj4616-[NOI2016模拟7.12]二进制的世界【平衡规划,dp】

正题 题目大意 nnn个数&#xff0c;对于每个数找左边的一个数执行optoptopt操作使得答案最大&#xff0c;并且求有多少个数能够使得最大。 解题思路 我们设fi,jf_{i,j}fi,j​表示下一个数的后888位为iii&#xff0c;当前数的前888位为jjj时的最大后888位的答案。然后每次用fi,…

Wannafly挑战赛17

剩下的不太会就没接着打了&#xff0c;没有注意到比赛截至时间&#xff0c;好像提前了几分钟公开题解。意识到的时候已经来不及了。。。抱歉。。。 —————————————————————————————————————— A.走格子 按题意模拟即可 #include <bits/…

【结论】环

环 题目大意&#xff1a; 给出一个环中的三个数&#xff0c;这三个数按输入顺序连接&#xff08;有向&#xff09;&#xff0c;问连接的线是顺时针还是逆时针 原题&#xff1a; 题目描述 有一个圆&#xff0c;1-N共N个数在圆环上顺时针排列着。 现在给你a,b,c三个数&#…

Asp.Net Core 快速邮件队列设计与实现

发送邮件几乎是软件系统中必不可少的功能&#xff0c;在Asp.Net Core 中我们可以使用MailKit发送邮件&#xff0c;MailKit发送邮件比较简单&#xff0c;网上有许多可以参考的文章&#xff0c;但是应该注意附件名长度&#xff0c;和附件名不能出现中文的问题&#xff0c;如果你遇…

CF1114F-Please, another Queries on Array?【线段树,欧拉函数】

正题 题目链接:https://www.luogu.com.cn/problem/CF1114F 题目大意 nnn个数的一个序列要求支持 区间乘上一个数询问一个区间的乘积的φ\varphiφ值 解题思路 因为数很小&#xff0c;而我们求φ\varphiφ需要知道一个数所包含的质因子。发现在300300300以内的只有626262个质…

牛客练习赛20

A. 礼物 枚举一元奥利奥的个数&#xff0c;计算2元的个数&#xff0c;现在需要解决从N种物品中&#xff0c;取x个的方法数&#xff0c;把N个种类看作N个盒子&#xff0c;奥利奥看作球&#xff0c;就是经典球盒模型了。 #include <bits/stdc.h> #define rep(i,a,b) for(in…

【模拟】数列

数列 题目大意&#xff1a; 有一个序列&#xff0c;1,11,21,1211,111221,3122111,11,21,1211,111221,3122111,11,21,1211,111221,312211&#xff0c;形如上一个数有x1x_1x1​个x2x_2x2​&#xff0c;x3x_3x3​个x4x_4x4​&#xff0c;把x连起来即为当前数 原题&#xff1a; …