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如何监听请求,并交给处理管道进行处理的。
最新文章
- 安卓虚拟机adb shell sqlite3数据库
- c/c++ string
- myeclipse,eclipse打开当前文件所在文件夹
- Atitit 图像处理之仿油画效果&#160;Oilpaint油画滤镜 水彩画 漫画滤镜&#160;v2
- JavaScript中new和this
- js 全选 反选
- Codeforces Wilbur and Array
- Java面试题之四
- HDU 5741 Helter Skelter
- vue-router如何根据不同的用户给不同的权限
- Maven(三)在Eclipse中使用Maven与Maven坐标
- zookeeper 启动失败 BindException: Address already in use 或者Error contacting service. It is probably not running
- 【数学建模】【APIO2015】Palembang Bridges
- SQLServer之附加数据库
- 接口测试工具-tamper data
- 16.ajax_case01
- 关于window 图片系统功能
- BZOJ 4584 luogu P3643: [Apio2016]赛艇
- 计算机cpu、寄存器、内存区别
- 批量增加Linux系统账号、重置账号密码、FTP账号批量测试
热门文章
- Linux_服务器_03_xxx is not in the sudoers file.This incident will be reported.的解决方法
- darknet YOLO 编译使用GPU
- 生成0-42之间的7个不重复的int值
- BZOJ4836: [Lydsy1704月赛]二元运算
- BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
- CSS 浏览器兼容
- 基于Html5的移动端APP开发框架
- POJ1797(dijkstra求最短最长边)
- 跑monkey前开启/关闭下拉栏
- __setup宏简介