.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("");
return next.Invoke(context);
};
}); Use(next =>
{
return context =>
{
Console.WriteLine("");
return next.Invoke(context);
};
}); Use(next =>
{
return context =>
{
Console.WriteLine("");
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("");
return Task.CompletedTask;
//return next.Invoke(context);
};
});

总结:

这样的一种模式扩展性比较好,比如一个项目中要使用MVC则写app.UseMvc来添加进去,使用Session,则用app.UseSession()。

Session/Route/Cros等都是使用Middleware来实现的

最新文章

  1. 用JqueryUI的Dialog+IFrame实现仿模态窗口效果
  2. 掌握SortSet接口和Set接口的关系,以及常用方法。
  3. linux下查看电脑配置
  4. [转载-仅为个人学习所用]Stack Menu
  5. 『安全科普』HTTP协议讲解及手工模拟发送
  6. thinkphp框架的路径问题 - 总结
  7. python成长之路——第四天
  8. java设计模式之——适配器模式
  9. 【转】Android 图层引导帮助界面制作
  10. UVALive - 4670 Dominating Patterns AC 自动机
  11. openstack第五章:cinder
  12. 一串数字中,只有一个数字出现一次,其他数字都出现两次,查找出这个数字(python)(原创)
  13. iOS 利用高德地图WMS服务
  14. 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析
  15. Linux安装配置JDK1.7
  16. visual studio code插件精选
  17. ASP.NET 网站超时跳转到登录界面
  18. AngularJS 表达式 对象和数组
  19. 网络编程—代码—UDP数据报传输
  20. 面试----java基础集合---------------------comparable和comparator 的区别

热门文章

  1. STL之三:deque用法详解
  2. centos6.5 配置mongodb3
  3. 南阳ACM 题目8:一种排序 Java版
  4. [USACO06NOV] Corn Fields
  5. PHP系统编程--02.PHP守护进程化
  6. jsp05 指令与动作
  7. JS之document例题讲解1(两张表之间数据转移、日期时间选择、子菜单下拉、用div做下拉菜单、事件总结)
  8. LTC 钱包部署
  9. Exponial (欧拉定理+指数循环定理+欧拉函数+快速幂)
  10. 微信小程序setData子元素