.net core 自定义中间件

一、中间件介绍

  中间件是组装到应用程序管道中用来理请求逻辑和响应逻辑的组件。

  每个组件都可以:

    1.选择是否将请求传递给管道中的下一个组件。

    2.调用管道中的下一个组件之前和之后执行的工作。

  请求委托(Requestdelegates)用于构建请求管道,处理每个HTTP请求。

 

二、中间件处理流程

  中间件的执行分为请求进来的逻辑与响应出去的逻辑,进来的逻辑按照注册中间件的顺序,响应出去的逻辑则相反。

  中间件的请求流程由一系列请求委托组成,如下图所示,分别注册了三个中间件Middleware1,Middleware2,Middleware3。请求进来时会走请求逻辑logic,然后执行类型为Requestdelegates的委托对象next(),之后会走第二个中间件Middleware2的请求逻辑,如黑色箭头所示,直到走完最后一个中间件后,会以Middleware3,Middleware2,Middleware1的顺序走响应逻辑more logic。

三、自定义中间件

  有很多中间件微软已经给我提供了,但是如何自定义中间件呢?

第一步:定义一个类,并添加以下代码

    public class Middleware1
    {
        private readonly RequestDelegate _next;

        /// <summary>
        /// 管道执行到该中间件时候下一个中间件的RequestDelegate请求委托,如果有其它参数,也同样通过注入的方式获得
        /// </summary>
        /// <param name="next"></param>
        public Middleware1(RequestDelegate next)
        {
            //通过注入方式获得对象
            _next = next;
        }

        /// <summary>
        /// 自定义中间件要执行的逻辑
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            Console.WriteLine("Request1");//请求进来时逻辑,为了验证顺序性,打印一句话
            await _next(context);//把context传进去执行下一个中间件
            await context.Response.WriteAsync("<p>Response1</p>");//响应出去时逻辑,为了验证顺序性,输出一句话
        }
    }

第二步:在Startup类中的Configure方法下,通过调用UseMiddleware方法注册中间件。如果自定义的中间件Invoke方法需要传递参数,则可以通过UseMiddleware方法把参数传进去,而自定义的Middleware1则需要通过依赖注入的方式拿到所传进去的参数

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
        //按顺序注册Middleware1,Middleware2,Middleware3。Middleware2,Middleware3和Middleware1一样,我就懒得写了
            app.UseMiddleware<Middleware1>();
            app.UseMiddleware<Middleware2>();
            app.UseMiddleware<Middleware3>();
        }

执行结果:

 

posted @ 2019-06-02 21:14  六点钟苹果  阅读(4050)  评论(1编辑  收藏  举报