ASP.NET Core中间件

posted at 2021.4.25 11: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技术

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading