asp.net core mvc是微软开源的跨平台的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平台,然后又增加了一些非常实用的新功能,比如taghelper,viewcomponent,DependencyInjection等,现在开始asp.net core mvc剖析之旅。

任何应用程序都有入口点,MVC中也如此,通过新框架创建的MVC程序里,有一个特殊的文件Program.cs,里面包含了一个Main方法,这个方法相信大家都不陌生,控制台应用程序也有类似的Main方法,这个方式其实就是MVC程序的入口方法,那我们来看一下这个方法里主要做了什么工作?

     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方法里有几句关键代码:

 //创建应用程序依赖注入的IServiceCollection对象,这个后面会单独去讲解
var hostingServices = BuildHostingServices();
var hostingContainer = hostingServices.BuildServiceProvider();
//实例化WebHost对象
var host = new WebHost(hostingServices, hostingContainer, _options, _config);
//初始化
host.Initialize();

  在WebHost类中找到Initialize()方法,方法里调用了BuildApplication完成http请求处理管道的构建。我们来看下构建处理管道的过程。

//这个方法其实是调用程序里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方法进行服务启动

 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方法进行请求处理:

public Task ProcessRequestAsync(Context context)
{
return _application(context.HttpContext);
}

  ProcessRequestAsync方法里很简单,直接把http请求放入http处理管道进行处理。

下一篇文章会介绍KestrelServer如何监听请求,并交给处理管道进行处理的。

asp.net core mvc剖析:启动流程的更多相关文章

  1. asp.net core mvc剖析:处理管道构建

    在启动流程文章中提到,在WebHost类中,通过BuildApplication完成http请求处理管道的构建.在来看一下代码: ...... //这个调用的就是Startup.cs类中的Config ...

  2. asp.net core mvc剖析:路由

    在mvc框架中,任何一个动作请求都会被映射到具体控制器中的方法上,那框架是如何完成这样一个过程的,现在我们就来简单分析下流程. 我们紧跟上面的主题,任何一个请求都会交给处理管道进行处理,那mvc处理的 ...

  3. asp.net core mvc剖析:KestrelServer

    KestrelServer是基于Libuv开发的高性能web服务器,那我们现在就来看一下它是如何工作的.在上一篇文章中提到了Program的Main方法,在这个方法里Build了一个WebHost,我 ...

  4. asp.net core mvc剖析:mvc执行过程(一)

    前面介绍了路由的过程,我们再来看下MvcRouteHandler的代码: public Task RouteAsync(RouteContext context) { ...... //根据路由信息查 ...

  5. asp.net core mvc剖析:mvc动作选择

    一个http请求过来后,首先经过路由规则的匹配,找到最符合条件的的IRouter,然后调用IRouter.RouteAsync来设置RouteContext.Handler,最后把请求交给RouteC ...

  6. asp.net core mvc剖析:动作执行

    紧跟上一篇文章.通过路由和动作匹配后,最终会得到跟当前请求最匹配的一个ActionDescriptor,然后通过IActionInvoker执行动作. 我们先来看一下IActionInvoker如何得 ...

  7. 扒一扒asp.net core mvc控制器的寻找流程

    不太会排版,大家将就看吧. asp.net core mvc和asp.net mvc中都有一个比较有意思的而又被大家容易忽略的功能,控制器可以写在非Web程序集中,比如Web程序集:"MyW ...

  8. ASP.NET Core MVC 源码学习:详解 Action 的激活

    前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...

  9. ASP.NET Core MVC 源码学习:详解 Action 的匹配

    前言 在 上一篇 文章中,我们已经学习了 ASP.NET Core MVC 的启动流程,那么 MVC 在启动了之后,当请求到达过来的时候,它是怎么样处理的呢? 又是怎么样把我们的请求准确的传达到我们的 ...

随机推荐

  1. (简单) POJ 2240 Arbitrage,SPFA。

    Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit o ...

  2. MySQL show master / slave status 命令参数

    一.show master status 二.show slave status Slave_IO_State SHOW PROCESSLIST输出的State字段的拷贝.SHOW PROCESSLI ...

  3. STM32硬件IIC操作

    Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...

  4. 总结分享十大iOS开发者最喜爱的库 分类: ios相关 app相关 2015-04-03 16:43 320人阅读 评论(0) 收藏

    该10大iOS开发者最喜爱的库由"iOS辅导团队"成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个 ...

  5. 在PHP语言中使用JSON

      目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. 我写过一篇<数据类型和JSON格式>,探讨它的设计思想.今天,我想总结一下PHP语言对它的支持,这是开发 ...

  6. UVa 990 - Diving for Gold

    题目大意:一个潜水者去海底寻找金子,已知有n个有金子的地点,分别给出他们的深度和价值.但是由于潜水者只有一瓶氧气,所以他只能在海底呆有限的时间,问他如何才能在这有限的时间里获得尽可能多的金子,并打印出 ...

  7. UVa 10033 - Interpreter

    题目大意:模拟题,有一些寄存器和随机访问内存,给你一些指令以及它们代表的操作,模拟操作即可. #include <cstdio> #include <cstring> #def ...

  8. Mysql 创建数据库后修改属性

    添加表字段 alter table table1 add transactor varchar(10) not Null; alter table   table1 add id int unsign ...

  9. freemarker配置,使用

    最近在项目中用到freemarker,总是报一些莫名其妙的错误. 调查得知是由于在配置文件中属性[tag_syntax]的设置问题,我们的环境下该属性(auto_detect)默认设置了自动检测,也就 ...

  10. maven 第一次运行报错

    在大中国的网络环境下,使用一些国外的资源,是一件很痛苦的事情... 大概在好几个月以前,一个同事跟我说,没事的时候学习maven,现在公司项目都用这个做管理 还给了我电子书<Maven实战> ...