用.Net Core控制台模拟一个ASP.Net Core的管道模型
在我的上几篇文章中降到了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控制台模拟一个ASP.Net Core的管道模型的更多相关文章
- 使用Visual Studio Code创建第一个ASP.NET Core应用程序
全文翻译自:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 这篇文章将向你展示如何在Mac上写出你的第一个A ...
- 如何一秒钟从头构建一个 ASP.NET Core 中间件
前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...
- Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群
Kubernetes简介 Kubernetes是Google基于Borg开源的容器编排调度引擎,作为CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的 ...
- 从零写一个Asp.net core手脚架(模型验证)
一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.n ...
- .NET Core开发日志——从ASP.NET Core Module到KestrelServer
ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...
- List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac
List多个字段标识过滤 class Program{ public static void Main(string[] args) { List<T> list = new List& ...
- ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 迁移数据 上一章节中我们配置了 ...
- .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介
.NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and ...
- .NET Core 2.0和ASP.NET Core 2.0正式版抢先体验
.NET Core 2.0和ASP.NET Core 2.0正式版抢先体验 .NET Standard 2.0 is final Broad platform support. .NET Standa ...
随机推荐
- WebService的学习
这篇文章不错,直接转了 http://blog.csdn.net/terryzero/article/details/5976638#comments
- Windows Azure Storage (25) Azure Append Blob
<Windows Azure Platform 系列文章目录> 在笔者之前的文章中,我们介绍了Azure Blob 有两种:Block Blob和Page Blob. 在这里笔者介绍Blo ...
- Angular20 nginx安装,angular项目部署
1 nginx安装(Windows版本) 1.1 下载安装包 到官网下载Windows版本的nginx安装包 技巧01:下载好的压缩包解压即可,无需安装 1.2 启动nginx 进入到解压目录,点击 ...
- CentOS7上Docker安装与卸载
安装 1.安装Docker 参见:https://docs.docker.com/engine/installation/linux/centos/ 2.直接使用root安装(更新系统) yum up ...
- 【国家集训队2010】小Z的袜子[莫队算法]
[莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...
- linux下简洁优化部署tomcat应用
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本文是自己根据公司架构部署tomcat方法整理出来的文本 修 ...
- mybatis like条件添加%的方法
使用 MySQL可以使用CONCAT函数.例: <if test="userName != null and userName != ''"> and user_nam ...
- ubuntu安装nginx和设置网站https访问
安装nginx 在控制台 输入 sudo apt-get install nginx 等待安装成功之后.可以打开浏览器.输入你的域名或者ip地址会出现"Welcome to nginx!&q ...
- Jenkins +git +python 进行持续集成进行接口测试(接口测试jenkins持续集成篇)
使用jenkins+git+python脚本进行持续集成的接口测试,在jenkins平台,利用插件等,把管理代码的git仓库的代码更新下来进行持续接口测试,python进行开发测试脚本,git进行远程 ...
- 3.2 while 循环
Python 编程中 while 语句用于循环执行程序,即在条件满足的情况下,循环执行某段代码.所以就需要在循环的代码块中设计一种使代码块循环执行一定次数后是while语句的条件不满足,从而中止whi ...