.NetCore 简单的使用中间件

摘要:
app.Use()IApplicationBuilderUse(函数<app.Use)(next=>});动作<配置);privatevoidDoMyHandler(IApplicationBuilderbuild){build.Use(next=>

//定义中间件

我们定定义中间件通常有 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:一些简单的测试截图如下:

.NetCore 简单的使用中间件第1张

.NetCore 简单的使用中间件第2张

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

 .NetCore 简单的使用中间件第3张

免责声明:文章转载自《.NetCore 简单的使用中间件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS的永久存储SetFilePointer 使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RxJava学习(一)

注意:文字和图片转载自抛物线博客 参考:http://gank.io/post/560e15be2dca930e00da1083 RxJava 到底是什么 一个词:异步。 RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs usin...

Android常见问题1:窗体泄露(1)

  今天学习对话框AlertDialog,写一个Demo,需求是:只有一个Activitty,在这个Activity中只有一个按钮Button,当点击按钮Button时,弹出对话框,提示是否关闭该Activity,退出程序(只有一个界面). MainActivity源码: 1 package com.my.day22_my_dialog1; 2 3...

线程同步以及AutoResetEvent

近期在重构老项目时发现有些地方用了AutoResetEvent,于是查了些资料学习整理。 线程同步介绍 即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。 同步就是协同步调,按预定的先后次序进行运行。如...

uni-app 安卓和IOS更新方案

一、安卓平台 整包更新(apk),即常规的整个App安装包重新下载安装。 资源热更新(wgt),即App并重新安装,里面的js等前端代码进行更新。 Android App,可以直接下载新的apk,只要包名和证书不变,就可以覆盖安装。  安卓平台更新方案,详见上一篇文章https://www.cnblogs.com/tiandi/p/15331522.h...

gitk、Git GUI 图形化工具中文显示乱码的解决方案

在Windows下使用gitk、Git-Gui时,可能会出现代码中的中文乱码的情况。解决方法:在软件的安装目录下,在Gitmingw64etcgitconfig文件末尾添加: [gui]encoding=utf-8 这样代码中的中文就能够正常显示了。 另外 关于软件的其他部分的软件相关中文乱码,解决方法如下:打开软件,在Edit -> Prefere...

js之Function原型

在ECMAScript中,Function(函数)类型实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。 1、三种函数声明的方式  1》第一种:普通方式声明函数 1 function box (num1,num2){ 2 return nu...