• .NetCore 简单的使用中间件


    //定义中间件

    我们定定义中间件通常有 app.Use(), app.Run(), app.Map() , appMapWhen()四个方法

    1:app.Use()

    IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);

    其中 RequestDelegate 仍然是一个委托,需要满足如下的签名

    public delegate Task RequestDelegate(HttpContext context);

     

    app.Use(next =>
    {
           return new RequestDelegate(async c =>
          {
        await c.Response.WriteAsync("start-88888888888");
        await next.Invoke(c);
        await c.Response.WriteAsync("end-88888888888");
          });
    });

     

    2:app.Run() 默认会终止后面的所有管道事件或者中间件等函数,如果app.Use()去掉了 await next.Invoke()就和 app.Run()是等价的效果

    3:app.Map()  这个方法为我们提供了一些方便的分支处理 ,它是在管道中增加了分支。通过映射路径来判断处理管道分支

      public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action<IApplicationBuilder> configuration);

    pathMatch 我们从字面意思上就可以理解到,请求的链接路径匹配的话,就执行 configuration 里面的中间件或者函数

     

       app.Map("/mapTest", DoMyHandler);   //doHandler 为自定义的相关匹配签名函数即可
        app.Run(async context =>
               {
                          await context.Response.WriteAsync("  hello world! ");
               });

      private void DoMyHandler(IApplicationBuilder build)
      {
         build.Use(next => new RequestDelegate(async c =>
         {
        await c.Response.WriteAsync("你好");
         }));
      }

    //--或者如下

       private static void doMyHandler(IApplicationBuilder app)
           {
               app.Run(async context =>
               {                await context.Response.WriteAsync("你好我好大家好!");
               });
           }

    4:app.MapWhen() 从字面上可以理解为 符合判断才会进入对应的中间件

       app.MapWhen(context =>
       { 
            return context.Request.Query.ContainsKey("qq"); 
       }, DoMyHandler);  

    中间件我们通常是把上面的方法给提出来并放在一个class类里面,并进一步使用扩展方法, IApplicationBuilder相当于一个容器集合!

     5:一些简单的测试截图如下:

    6:新增扩展方法就显得更加的规范了:

     

  • 相关阅读:
    Cisco IOS XE 3S–to–Cisco IOS Release Number Mapping
    ORA-01157 误删表空间对应的dbf文件出现的错误的解决办法
    记录-Windows10 cnpm报禁止运行脚本
    记录-html和html5区别
    记录-查询硬盘物理序号
    CRC16 Java 实现
    kaldi解码及特征提取详解
    kaldi GMM模型解码指令 gmm-latgen-faster详解
    kaldi基于GMM的单音素模型 训练部分
    kaldi学习
  • 原文地址:https://www.cnblogs.com/Fengge518/p/12242435.html
Copyright © 2020-2023  润新知