//定义中间件
我们定定义中间件通常有 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:新增扩展方法就显得更加的规范了: