net core mvc剖析:启动流程
net core mvc剖析:启动流程
asp.net core mvc是微软开源的跨平台的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平台,然后又增加了一些非常实用的新功能,比如taghelper,viewcomponent,DependencyInjection等,现在开始asp.net core mvc剖析之旅。
任何应用程序都有入口点,MVC中也如此,通过新框架创建的MVC程序里,有一个特殊的文件Program.cs,里面包含了一个Main方法,这个方法相信大家都不陌生,控制台应用程序也有类似的Main方法,这个方式其实就是MVC程序的入口方法,那我们来看一下这个方法里主要做了什么工作?
1
2
3
4
5
6
7
8
9
10
11
|
public static void Main( string [] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); } |
从上面的代码我们可以看出,通过WebHostBuilder类Build了一个IWebHost对象,然后调用host.Run方法完成应用程序启动。那我们再来看一下,WebHost是如何被Build出来的。在Hosting项目中最终找到了WebHostBuilder类的踪影,Build方法里有几句关键代码:
1
2
3
4
|
//创建应用程序依赖注入的IServiceCollection对象,这个后面会单独去讲解 var hostingServices = BuildHostingServices(); var hostingContainer = hostingServices.BuildServiceProvider(); //实例化WebHost对象 var host = new WebHost(hostingServices, hostingContainer, _options, _config); //初始化 host.Initialize(); |
在WebHost类中找到Initialize()方法,方法里调用了BuildApplication完成http请求处理管道的构建。我们来看下构建处理管道的过程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//这个方法其实是调用程序里Startup类中的ConfigureServices方法,完成服务依赖注册 EnsureApplicationServices(); //IServer的相关操作 EnsureServer(); var builderFactory = _applicationServices.GetRequiredService<IApplicationBuilderFactory>(); var builder = builderFactory.CreateBuilder(Server.Features); builder.ApplicationServices = _applicationServices; var startupFilters = _applicationServices.GetService<IEnumerable<IStartupFilter>>(); Action<IApplicationBuilder> configure = _startup.Configure; foreach ( var filter in startupFilters.Reverse()) { //调用Startup类中的Configure方法注册处理中间件(middleware) configure = filter.Configure(configure); } configure(builder); return builder.Build(); |
到这里中终于明白startup.cs类作用了。完成了基本的配置后,应用程序就可以启动了。
WebHost.Run方法定义是在WebHostExtensions中,作为扩展方法存在的,Run方法中调用了WebHost的Start方法,WebHost的Start方法直接调用了IServer的Start方法进行服务启动
1
|
Server.Start( new HostingApplication(_application, _logger, diagnosticSource, httpContextFactory)); |
_application:http请求处理管道
httpContextFactory:httpcontext工厂,每个http请求都会对应一个httpcontext对象,这个httpcontext就由这个工厂进行创建,这个工厂在HttpAbstractions项目中。
IServer启动方法里会启动请求监听,当http请求过来后,首先调用HostingApplication(IHttpApplication类型)的CreateContext创建HttpContext对象,CreateContext会依赖上面提到的httpContextFactory,HttpContext创建后就会调用HostingApplication的ProcessRequestAsync方法进行请求处理:
1
2
3
4
|
public Task ProcessRequestAsync(Context context) { return _application(context.HttpContext); } |
ProcessRequestAsync方法里很简单,直接把http请求放入http处理管道进行处理。
下一篇文章会介绍KestrelServer如何监听请求,并交给处理管道进行处理的。
net core mvc剖析:启动流程的更多相关文章
- asp.net core mvc剖析:启动流程
asp.net core mvc是微软开源的跨平台的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平台,然后又增加了一些非常实用的新功能,比如taghelper,viewcomponent,D ...
- asp.net core mvc剖析:处理管道构建
在启动流程文章中提到,在WebHost类中,通过BuildApplication完成http请求处理管道的构建.在来看一下代码: ...... //这个调用的就是Startup.cs类中的Config ...
- asp.net core mvc剖析:路由
在mvc框架中,任何一个动作请求都会被映射到具体控制器中的方法上,那框架是如何完成这样一个过程的,现在我们就来简单分析下流程. 我们紧跟上面的主题,任何一个请求都会交给处理管道进行处理,那mvc处理的 ...
- asp.net core mvc剖析:KestrelServer
KestrelServer是基于Libuv开发的高性能web服务器,那我们现在就来看一下它是如何工作的.在上一篇文章中提到了Program的Main方法,在这个方法里Build了一个WebHost,我 ...
- asp.net core mvc剖析:mvc执行过程(一)
前面介绍了路由的过程,我们再来看下MvcRouteHandler的代码: public Task RouteAsync(RouteContext context) { ...... //根据路由信息查 ...
- asp.net core mvc剖析:mvc动作选择
一个http请求过来后,首先经过路由规则的匹配,找到最符合条件的的IRouter,然后调用IRouter.RouteAsync来设置RouteContext.Handler,最后把请求交给RouteC ...
- asp.net core mvc剖析:动作执行
紧跟上一篇文章.通过路由和动作匹配后,最终会得到跟当前请求最匹配的一个ActionDescriptor,然后通过IActionInvoker执行动作. 我们先来看一下IActionInvoker如何得 ...
- 扒一扒asp.net core mvc控制器的寻找流程
不太会排版,大家将就看吧. asp.net core mvc和asp.net mvc中都有一个比较有意思的而又被大家容易忽略的功能,控制器可以写在非Web程序集中,比如Web程序集:"MyW ...
- ASP.NET Core MVC 源码学习:详解 Action 的激活
前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...
随机推荐
- app测试点-1
一.安全测试 1.软件权限 1)扣费风险:包括短信.拨打电话.连接网络等. 2)隐私泄露风险:包括访问手机信息.访问联系人信息等. 3)对App的输入有效性校验.认证.授权.数据加密等方面进行检测 4 ...
- Python 微信通知 先挖个坑
桑心病狂,试试把报警信息发到微信上 原文 https://segmentfault.com/a/1190000009717078
- 网络编程学习笔记-linux常用的网络命令
网络参数设置命令 所有时刻如果你想要做好自己的网络参数设置,包括IP参数.路由参数和无线网络等,就得要了解下面这些相关的命令才行.其中Route及ip这两条命令是比较重要的.当然,比较早期的用法,我们 ...
- JSP 使用<%@include%>报Duplicate local variable path 错误 解决方法
错误提示:Multiple annotations found at this line:- Duplicate local variable path- Duplicate local variab ...
- javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- uC/OS-II源码分析(一)
下载地址:http://www.micrium.com/ 它的特点: 1)开源, 2)可移植性,绝大部分代码用C写,硬件相关部分用汇编写, 3可固化, 4)可剪裁,这通过条件编译实现,使用#defin ...
- Polygon
用当前的笔绘制一个由两个或多个点(顶点)连接的多边形. BOOL Polygon( LPPOINT lpPoints, int nCount ); lpPoints 指向一个指定多边形顶点的点.数组中 ...
- Collection与Map总结
顺序表和链表统称为线性表:顺序表一般表现为数组,如:ArrayList的实现;链表有单链表.双链表.循环链表的区分,如:LinkedArrayList由双链表+哈希表实现
- LeafLet之气泡框隐藏"x"图标
例子:var marker.bindPopup( "我是一个图标的文本", { minWidth: 300 }).openPopup();L.Popup Constructor(函 ...
- hbase multiple SLF4J&n…
hbase multiple SLF4J bindings 警告 hbase shell 和命令操作中经常有个烦人的警告,说SLF4J有多个绑定: hbase(main):003:0> list ...