• 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如何监听请求,并交给处理管道进行处理的。

  • 相关阅读:
    053(九)
    方法的重载
    方法的重写(override / overwrite)
    属性与局部变量的对比
    面向对象基础知识合集:对象的产生、对象的生命周期、内存解析
    使用二维数组打印一个 10 行杨辉三角
    数组中的常见异常: 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion 2. 空指针异常:NullPointerException
    快速排序
    * 数组的冒泡排序的实现
    * 二维数组的使用
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6418046.html
Copyright © 2020-2023  润新知