zoukankan      html  css  js  c++  java
  • .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>();
            }

    执行结果:

  • 相关阅读:
    【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例
    [Usaco2008 Dec]Patting Heads
    Hibernate(六)——多对多关联映射
    2017第2周一小程序
    2017第一周日
    2017第一周六
    无论你如何努力,总会有人讨厌你
    word使用技巧-批量删除图片技巧
    Web跨域问题总结
    JAVA语言的本质优势
  • 原文地址:https://www.cnblogs.com/yijiayi/p/10964418.html
Copyright © 2011-2022 走看看