.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来实现的

.net core 2.0学习记录(四):Middleware使用以及模拟构建Middleware(RequestDelegate)管道的更多相关文章

  1. .net core 2.0学习记录(三):内置IOC与DI的使用

    本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...

  2. .net core 2.0学习记录(一):搭建一个.Net Core网站项目

    .Net Core开发可以使用Visual Studio 2017或者Visual Studio Code,下面使用Visual Studio 2017搭建一个.net Core MVC网站项目. 一 ...

  3. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  4. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplistleveldb 学习记录(二) Sliceleveldb 学习记录(三) MemTable 与 Immutable Memtablelevel ...

  5. JavaScript学习记录四

    title: JavaScript学习记录四 toc: true date: 2018-09-16 20:31:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  6. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  7. 4.VUE前端框架学习记录四:Vue组件化编码2

    VUE前端框架学习记录四:Vue组件化编码2文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  8. ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录

    升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...

  9. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建

    作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...

随机推荐

  1. Cows POJ - 2481 树状数组

    Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can ...

  2. 题解【poj2774 Long Long Message】

    Description 求两个串的最长连续公共字串 Solution 后缀数组入门题吧 把两个串连在一起,中间加一个分隔符,然后跑一遍后缀数组,得到 height 和 sa 一个 height[i] ...

  3. 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance

    引言 二维动态规划中最常见的是棋盘型二维动态规划. 即 func(i, j) 往往只和 func(i-1, j-1), func(i-1, j) 以及 func(i, j-1) 有关 这种情况下,时间 ...

  4. 用pip命令安装Python第三方库

    一.准备工作 1. 安装pip (1)下载 pip下载地址:https://pypi.python.org/pypi/pip#downloads (2)安装 下载后解压,控制台下进入解压后的目录,运行 ...

  5. 51Nod 最大子矩阵和 | DP

    Input 第1行:M和N,中间用空格隔开(2 <= M,N <= 500). 第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开.(-10^9 <= M[i] < ...

  6. HDU 5876 Sparse Graph BFS+set删点

    Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices s ...

  7. Enterprise Architect13 : 去掉UML图页面右侧那一道竖线

    我们在使用Enterprise Architect 中,画用例图,时序图时,页面右侧有一条竖线,见下图: 如果页面元素太多,会超出竖线的范围,显得很不协调. 如果像去掉竖线,只需选择主菜单的Layou ...

  8. Flume入门——Selector、Chanel等

    1.selector (http://blog.csdn.net/looklook5/article/details/40430965) (http://blog.csdn.net/xiao_jun_ ...

  9. Item 5 避免创建不必要的对象

    场景一: 这个是经常出现的问题,因为我们经常误用String. public class Test { public static void main(String[] args) { //参数&qu ...

  10. SQL SERVER 常用公式

    SQL SERVER 获取当前月的天数 SELECT -DAY(getdate()+-DAY(getdate())) SQL server 除法计算百分比[整数乘1.0否则结果为0或1] CONVER ...