ASPNetCore之中间件和请求处理管道(3)

启动的顺序 

Main-->CreateHostBuilder-->ConfigureWebHostDefaults
-->Startup-->ConfigureServices-->CreateHostBuilder-->Configure
-->WeatherForecastController-->api/Method

 中间件在Configure方法中是注重先后顺序的

 //Configure类是一定要的,哪怕里面是个空的、用来进行管道,http请求的处理
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                //Configure是用来处理中间件的方法  处理Http请求和相应
                //1:在请求之前和之后,执行一些相应的工作
                //2:异常中间件,日志,身份授权,记录请求,静态资源中间件
            //3:这些中间件都是特性功能的组件(类),单一职责
                if (env.IsDevelopment())//判断是否是开发者模式
                {
                    //异常中间件,当我们是开发者模式的情况下,这个组件就会被注册到请求处理管道中
                    app.UseDeveloperExceptionPage();//异常中间件
                }
                //我们在每个中间件当中,处理Http请求,之前或者之后
                //你也可以选择中间传递,传递到下一个中间件,你也可以不传递
                //这个输出了,下面的Hello World!就不会再输出了
                // app.Run(async context => { await context.Response.WriteAsync("Hello!!!!!"); });
               
                //这里加上Next 下面的Hello World!会输出的
                app.Use(async (context, next) => {
                    await context.Response.WriteAsync("Hello!!!!!");
                    await next();
                });
                app.UseRouting();//路由中间件
                //终结点中间件
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapGet("/", async context =>
                    {
                        await context.Response.WriteAsync("Hello World!");
                    });
                });
            }

请求处理管道 

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("middleware1_In
");
                await next();
                await context.Response.WriteAsync("middleware1_Out
");
            });
            // next()的作用:是否请求下个中间件
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("middleware2_In
");
                //await next();//如果这里将Next(),注释掉下面Run()的中间件是不会请求的==》称之为短路请//middleware1_In ===》middleware2_In ===》middleware2_Out ===》middleware1_Out
                //就不会再请求下面的middleware3_In了
                await context.Response.WriteAsync("middleware2_Out
");
            });

            //从Run()(短路中间件,开始返回)这里请求就开始返回了
            app.Run(async context =>
            {
                await context.Response.WriteAsync("middleware3_In
");

            });
            //middleware1_In
            //middleware2_In
            //middleware3_In
            //middleware2_Out
            //middleware1_Out
        }

1)ConfigureServices方法
   此方法在宿主程序开始运行时执行,主要功能是实现容器注入。也就是它只在主程序启动进执行一次。2)Configure方法
   在Configure方法中,我们看到使用了许多Use方法来处理http请求。
   在里面也可以自定义中间件。它贯穿了每个HTTP请求。
   重点:它在每一次http请求后时都会从头执行一次。

注:宿主程序
1:比如说asp.net应用程序和IIS,asp.net应用程序需要运行在IIS里面,IIS就是宿主程序.
2:在C#里面,宿主程序提供一个公用的接口规范,提供插件的入口,而编写插件的人员,
   只需要实现宿主提供的接口,生成动态库,然后由宿主程序利用反射技术,将插件加载到宿主程序里面,
   这样,最大的好处就是能够让开发更灵活,更容易维护和扩展。其实,IE就是一个典型的宿主程序
3:在计算机环境下,软件赖以生存的软件环境被称作是宿主环境(host environment). 
   CLR (Common Language Runtime),环境就是称作宿主(Host) 。
   宿主就是运行环境(即宿主程序),比如:asp需要运行在IIS里,IIS就是宿主程序。
   宿主环境(宿主程序)可以是操作系统,服务器程序,应用程序,
   而开发这些宿主环境的程序语言(如开发操作系统一般使用c语言,开发WebServer一般使用c或java语言,开发应用程序一般使用C++/java/c#语言)
   被称作系统开发语言,
   或用一个更贴切的说法是---宿主语言
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
原文地址:https://www.cnblogs.com/ZkbFighting/p/14694262.html