用.Net Core控制台模拟一个ASP.Net Core的管道模型
2017-12-21 21:24
621 查看
在我的上几篇文章中降到了asp.net core的管道模型,为了更清楚地理解asp.net core的管道,再网上学习了.Net Core控制台应用程序对其的模拟,以加深映像,同时,供大家学习参考。
首先,新建一控制台应用程序。注意是.Net Core的控制台应用程序。
然后新建一个Context类,以模拟ASP.net core中的context类,然后再Context类中添加一个Write方法。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks.Dataflow;
namespace MyPipleLine
{
public class Context
{
public void Write(string msg)
{
Console.WriteLine(msg);
}
}
}
然后新建一个RequestDelegate类,类中声明一个Requestdelegate的委托。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace MyPipleLine
{
public delegate Task RequestDelegate(Context context);
}
该RequestDelegate接收一个Context类型的值,返回的是Task类型。
然后,回到Pragrame.cs类中,
添加一个List,该List中保存了各个(中间件)。
public static List<Func<RequestDelegate, RequestDelegate>> _list = new List<Func<RequestDelegate, RequestDelegate>>();
添加一个Use方法。
public static void Use(Func<RequestDelegate, RequestDelegate> middleWare)
{
_list.Add(middleWare);
}
再ASP.NET Core应用程序中,我们经常再Startup.cs中的Config中使用app.Use()方法,这里的Use()就是模仿该app.Use()的方法。我们知道,Use()的方法有一种是添加一个传入类型是RequestDelegate 传出也是RequestDelegate的委托。 该委托,就是我们常常被称为的中间件。
然后回到Main方法中。
static void Main(string[] args)
{
Use(next => //往Use中添加一个传入类型为RequestDelegate,传出类型也为RequestDelegate的lambda表达式,
{
return context =>
{
context.Write("1"); //该委托中执行了context的中的方法。
return next.Invoke(context); //并继续执行下一个
};
});
Use(next =>
{
return context => //同上
{
context.Write("2");
return next.Invoke(context);
};
});
_list.Reverse(); //把_list中的内容颠倒一下顺序,因为如果不颠倒下,后先执行最后加入的中间件,后执行最先加入中间件。
RequestDelegate end = (context) =>
{
context.Write("end");
return Task.CompletedTask;
};
foreach (var middleware in _list)
{
end = middleware.Invoke(end); //把_list中的各个中间件“附加”到end委托上。
}
end.Invoke(new Context()); //调用end委托
Console.ReadLine();
}
我们查看一下运行结果:
这就是ASP.net core的管道模型的基本原理。
首先,新建一控制台应用程序。注意是.Net Core的控制台应用程序。
然后新建一个Context类,以模拟ASP.net core中的context类,然后再Context类中添加一个Write方法。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks.Dataflow;
namespace MyPipleLine
{
public class Context
{
public void Write(string msg)
{
Console.WriteLine(msg);
}
}
}
然后新建一个RequestDelegate类,类中声明一个Requestdelegate的委托。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace MyPipleLine
{
public delegate Task RequestDelegate(Context context);
}
该RequestDelegate接收一个Context类型的值,返回的是Task类型。
然后,回到Pragrame.cs类中,
添加一个List,该List中保存了各个(中间件)。
public static List<Func<RequestDelegate, RequestDelegate>> _list = new List<Func<RequestDelegate, RequestDelegate>>();
添加一个Use方法。
public static void Use(Func<RequestDelegate, RequestDelegate> middleWare)
{
_list.Add(middleWare);
}
再ASP.NET Core应用程序中,我们经常再Startup.cs中的Config中使用app.Use()方法,这里的Use()就是模仿该app.Use()的方法。我们知道,Use()的方法有一种是添加一个传入类型是RequestDelegate 传出也是RequestDelegate的委托。 该委托,就是我们常常被称为的中间件。
然后回到Main方法中。
static void Main(string[] args)
{
Use(next => //往Use中添加一个传入类型为RequestDelegate,传出类型也为RequestDelegate的lambda表达式,
{
return context =>
{
context.Write("1"); //该委托中执行了context的中的方法。
return next.Invoke(context); //并继续执行下一个
};
});
Use(next =>
{
return context => //同上
{
context.Write("2");
return next.Invoke(context);
};
});
_list.Reverse(); //把_list中的内容颠倒一下顺序,因为如果不颠倒下,后先执行最后加入的中间件,后执行最先加入中间件。
RequestDelegate end = (context) =>
{
context.Write("end");
return Task.CompletedTask;
};
foreach (var middleware in _list)
{
end = middleware.Invoke(end); //把_list中的各个中间件“附加”到end委托上。
}
end.Invoke(new Context()); //调用end委托
Console.ReadLine();
}
我们查看一下运行结果:
这就是ASP.net core的管道模型的基本原理。
相关文章推荐
- 用.Net Core控制台模拟一个ASP.Net Core的管道模型
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
- 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的
- 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server
- ASP.NET Core轻松入门之Middleware管道模型
- ASP.NET Core轻松入门之Middleware管道模型
- Intro to ASP.NET MVC 4 with Visual Studio [译五:添加一个模型]
- 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
- ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
- ASP.NET Core 一个Json返回类
- 用Php模拟asp.net的页面模型
- asp.net core 实现一个简单的仓储
- Asp.net管道模型(管线模型)
- ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现
- asp.net 管道模型+生命处理周期
- ASP.NET MVC 5 - 添加一个模型
- ASP.NET Core管道深度剖析[共4篇]
- ASP.NET 管道事件与HttpModule一个简单地实现
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求