启动的顺序
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#语言) 被称作系统开发语言, 或用一个更贴切的说法是---宿主语言