middleware 管道介绍


考试的时候,你坐在最后一排,一个学霸坐在了第一排,学霸把纸条从第一排往后给你传,传了5个人,传到你的手上了。
这里的纸条相当于Request,第一个截获请求,经他手之后,才会传到第二人手上,这个决定权是在前面的人手上的。
前面人不传递了,那么请求就到此结束了。
这里中间经过的每一个人都可以认为是一个“Middleware”
我们通过 IApplicationBuilder 的扩展方法来添加一个管道
public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware);
我们从定义中可以看到,这个 middleware 其实就是一个方法。
这个方法呢,传入的参数有两个,HttpContext,Func<Task>
Func<Task> 又是一个方法,即后面要调用的方法,我们可以认为是传递纸条中的下一个人。
返回的结果是一个 Task
public Task Method(HttpContext context, Func<Task> task){
}
管道的添加是在 Startup 文件中的 Configure 方法中,如下:
app.Use((context, next) => { context.Response.WriteAsync("a"); return next.Invoke(); }); app.Use((context, next) => { context.Response.WriteAsync("b"); return next.Invoke(); });
另一种添加管道的方法:
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware) //RequestDelegate 的定义 public delegate Task RequestDelegate(HttpContext context) public delegate TResult Func<in T, out TResult>(T arg)
namespace ConsoleApp2 { class Program { private static List<Func<PapgerDelegate, PapgerDelegate>> list = new List<Func<PapgerDelegate, PapgerDelegate>>(); static void Main(string[] args) { Console.WriteLine("Hello World!"); Add(next => { return (p) => { p.Content += "person1 \r\n"; next.Invoke(p); }; }); Add(next => { return (p) => { p.Content += "person2 \r\n"; next.Invoke(p); }; }); PapgerDelegate del = Build(); var model = new Papger(); del(model); Console.WriteLine(model.Content); } static void Add(Func<PapgerDelegate, PapgerDelegate> pipeline) { list.Add(pipeline); } static PapgerDelegate Build() { PapgerDelegate end = p => { p.Content += "end\r\n"; }; foreach (var func in list) { end = func.Invoke(end); } return end; } } public class Papger { public string Content { get; set; } } public delegate void PapgerDelegate(Papger pager); }
扫码分享
版权说明
作者:SQBER
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
{0}
{5}
{1}
{2}回复
{4}
*昵称:
*邮箱:
个人站点:
*想说的话: