ASP.NET Core中间件

posted at 2021.4.25 13:10 by administrator

ASP.NET Core中,处理请求和响应是一个管道模型,中间件表示这个管道模型中的处理环节。中间件是按照注册顺序工作的,先注册的中间件先执行,然后通过Next方法调用后续中间件,后续中间件执行完毕后,回到先前的中间件中,最终完成响应。

本质是,中间件是一组委托Microsoft.AspNetCore.Http.RequestDelegate所组成的。

具体定义如下:

 Public delegate Task RequestDelegate(HttpContext context);

这里可以看出中间件就是对HttpContext的处理函数,通过将一组包含不同功能的中间件进行串联,就得到完整的HTTP请求处理和响应输出的功能。

实质上中间件具备以下功能:

1、对HTTPContext进行处理,然后交给后续中间件处理,如路由中间件。

2、对HTTPContext进行处理,然后返回给上游中间件,如MVC中间件。

一、注册中间件

ASP.NET Core框架提供了多种方法来实现不同方式的注册。

1Use:以委托的方式注册中间件。

2UseMiddleware<T>:以类型的方式注册中间件,T表示中间件的类型。

3Map:将特定的请求地址(path)与中间件绑定,即path匹配时执行该中间件。

4MapWhen:定义一个逻辑判断委托,当判断为true时执行指定的中间件。

5Run:表示一个断路的中间件,是执行并返回给上游的中间件,无后续中间件。

  示例代码如下:

    public void Configure(IApplicationBuilder app)

        {

            app.Map("/thunder", abcBuild =>

            {

                abcBuild.Use(async (Context, next) =>

                    {

                        await next();

                        await Context.Response.WriteAsync("Hello guangbu!");

                    });

            });

        }

    要使用UseMiddleware<T>,需要使用符合中间件的类型,该方法没有使用泛型类型约束来约束T,而是使用了约定的方式。中间件类型需要符合下列的条件:

1、具有包含RequestDelegate作为参数的仅有构造函数。

2、具有InvokeInvokeAsynchronous方法,至少一个入参,并且第一个入参类型必须是HTTPContext,其返回值必须是Task

二、常用的内置中间件

     ASP.NET Core关于HTTP处理的核心功能都是以中间件的形式提供的,内置了许多中间件,这里列举一些常用的:

1、异常处理中间件:负责请求管道错误处理,一般注册在第一个,用来处理全局异常。

2、开发异常中间件:开发阶段使用的错误信息展示页。

3HTTPS重定向中间件:强制HTTPS跳转,当识别到用户请求不是HTTPS时,强制跳转,这是一个安全功能。

4、静态文件中间件:默认将wwwroot目录下的静态文件转出,当path与文件路径匹配时输出对应的文件。

5、路由中间件:将请求信息转化为路由信息,供后续终结点中间件使用。

6、身份认证中间件:启用身份认证,当终结点或者Controler上标识了身份认证特性时会进行身份认证。

7Endpoint中间件:定义ControlerURL的映射关系,为URL绑定处理程序,MVCRazorPagesSignalR等都是基于Endpoint中间件进行工作的。默认情况下,当请求与所有的Endpoint都不匹配时,应用程序会返回HTTP 404响应码,同时,提供了一组MapFallback方法来处理未匹配成功的请求。示例代码如下:

  public void Configure(IApplicationBuilder app)

      {

           //添加身份认证中间件

            app.UseAuthentication();

            app.UseRouting();

            app.UseCors();

            //添加授权中间件

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>

            {

                endpoints.MapControllerRoute(

                    name: "default",

                    pattern: "{controller=Course}/{action=List}/{id?}");

                    endpoints.MapFallbackToFile("clock.html");

            }); 

   }


Tags: , , , , , ,

IT技术

Add comment

  Country flag

biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading