zoukankan      html  css  js  c++  java
  • asp.net core mvc剖析:启动流程

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

  • 相关阅读:
    将方法作为方法的参数
    远程桌面无响应解决方案(转)
    QQ通信机制(转)
    电脑管家禁止程序修改文档后如何恢复权限
    SQL Sever——远程过程调用失败(0x800706be)
    JavaScript学习笔记之JavaScript调用C#编写的COM组件
    kendoUI 免费部分开发部分经验。
    mongoDB连接信息及生成对应的collection生成代码
    写个匹配某段html dom代码某属性的正则匹配方法
    微信获取用户支付共享地址
  • 原文地址:https://www.cnblogs.com/dxp909/p/6394131.html
Copyright © 2011-2022 走看看