.net core 2.0学习记录(四):Middleware使用以…
2018-06-22 07:56:04来源:未知 阅读 ()
.net Core中没有继续沿用以前asp.net中的管道事件,而是开发了一个新的管道(Middleware):
public class MiddlewareDemo { private readonly RequestDelegate _next; public MiddlewareDemo(RequestDelegate next) { _next = next; } public Task Invoke(HttpContext httpContext) { //可以在此处写一些需要的代码 return _next.Invoke(httpContext); } }
在Startup的Configure方法中用UseMiddleware方法添加到管道中去
app.UseMiddleware<MiddlewareDemo>();
如果将_next.Invoke(httpContext)改成Task.CompletedTask那么后续添加的Middleware都不会执行了
public Task Invoke(HttpContext httpContext) { return Task.CompletedTask; //return _next.Invoke(httpContext); }
通过查看UseMiddleware方法源代码,发现其实际调用的是IApplicationBuilder的Use方法
模拟构建Middleware(RequestDelegate)管道
方便演示我们就创建控制台项目,代码如下:
public delegate Task RequestDelegate(Context context);
public class Context { }
class Program { static List<Func<RequestDelegate, RequestDelegate>> list = new List<Func<RequestDelegate, RequestDelegate>>(); static void Main(string[] args) { Use(next => { return context => { Console.WriteLine("111"); return next.Invoke(context); }; }); Use(next => { return context => { Console.WriteLine("222"); return next.Invoke(context); }; }); Use(next => { return context => { Console.WriteLine("333"); return next.Invoke(context); }; }); Build(); Console.Read(); } static void Use(Func<RequestDelegate, RequestDelegate> middleware) { list.Add(middleware); } static void Build() { RequestDelegate endReq = (context) => { Console.WriteLine("end"); return Task.CompletedTask; }; list.Reverse(); //不反转的话最后添加的会先执行 foreach (var middleware in list) { endReq = middleware.Invoke(endReq); }
//执行到此处endReq是第一个添加到list集合中的Middleware endReq(new Context()); } }
运行结果:
如果在某一个Use方法中不执行next.Invoke(context),那么后续使用Use方法添加的都不会执行了,改成如下:
Use(next => { return context => { Console.WriteLine("222"); return Task.CompletedTask; //return next.Invoke(context); }; });
总结:
这样的一种模式扩展性比较好,比如一个项目中要使用MVC则写app.UseMvc来添加进去,使用Session,则用app.UseSession()。
Session/Route/Cros等都是使用Middleware来实现的
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- asp.net源程序编译为dll文件并调用的实现过程 2020-03-29
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据 2020-03-29
- Asp.Net中WebForm的生命周期 2020-03-29
- ASP.NET使用Ajax返回Json对象的方法 2020-03-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash