ASP.NET Core轻松入门之Middleware管道模型
Middleware指的是微软的的asp.net core的管道模型。其原理可以用微软官方的下图展示:
原理如上图,随着Request的发起,HttpContext会经历多个管道处理(图中的箭头游走方向)每经过一个处理,HttpContext内都会被加入一些东西或者被做一些修改,在每个管道处理完成后,随着Next()传到下一个管道处理。
下面 ,我们在ASP.Net Core应用程序中添加我们自己构建的管道。
首先,我们新建一个空白的ASP.NET Core应用程序。
然后,打开Startup.cs ,在congfig方法内加入一些代码。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("1");
await next.Invoke();
});
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
加入了红色部分后,我们看看网页如何显示。
在hello world 之前输出了1,那么我们把next删除之后,看看会怎样
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("1");
// await next.Invoke();
});
结果如下,只输出一个1
所以说,如果没有next方法,是不会调用下一个管道的。
还有一种使用方法是这样的。
因为我们看到,use方法可以传入一个RequestDelegate,返回也是一个RequestDelegate,所以我们可以写这么一个方法
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("1");
await next.Invoke();
}); app.Use((next) =>
{
return (context) =>
{
context.Response.WriteAsync("2");
return next(context);
};
});
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
可以看到 ,添加的代码,传入传出都是一个委托,如果这个函数看不懂的,请自行百度 lambda表达式和委托相关的知识。
输出,我们看到如下结果:
(把上文注释了的next方法记得恢复)
我们的asp.net core管道中,其实,还提供了路由方法(Map),其使用方法如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Map("/test", appTest =>
{
appTest.Run(async (context) =>
{
await context.Response.WriteAsync("this is tets Map");
});
});
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("1");
await next.Invoke();
}); app.Use((next) =>
{
return (context) =>
{
context.Response.WriteAsync("2");
return next(context);
};
});
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
要注意得是Map方法要放在最后一个Next方法得前面,因为如果放在后面,会被截断不执行这个管道,你体会一下!
这是全部关于管道得介绍,有任何疑问欢迎大家来我的个人网站给我留言。
ASP.NET Core轻松入门之Middleware管道模型的更多相关文章
- asp.net core轻松入门之MVC中Options读取配置文件
接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...
- 菜鸟入门【ASP.NET Core】8:Middleware管道介绍、自己动手构建RequestDelegate管道
中间件:是汇集到以处理请求和响应的一个应用程序管道的软件. 每个组件: 可以选择是否要将请求传递到管道中的下一个组件. 之前和之后调用管道中的下一个组件,可以执行工作. 使用请求委托来生成请求管道. ...
- ASP.NET Core轻松入门之Configure中IHostingEnvironment和IApplicationLifetime的使用
在StratUp.cs的Configure方法中,除了 常用的参数除了IApplicationBuilder和在我上一篇文章中提到的Iconfiguration点击打开链接 外 还有 IHostin ...
- Asp.Net Core轻松入门之WebHost的配置
在本篇文章中,我来讲一讲如何利用WebHost来加载配置文件和设置启动的Url 在前面的文章中讲过,ASP.Net Core应用程序会自动加载appsettings.json中的配置文件,那么如果配置 ...
- ASP.NET Core轻松入门Bind读取配置文件到C#实例
首先新建一个ASP.NET Core空项目,命名为BindReader 然后 向项目中添加一个名为appsettings.json的json文件,为什么叫appsettings呢? 打开Progra ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- Asp.Net Core 轻松学系列-1阅读指引目录
https://www.cnblogs.com/viter/p/10474091.html 目录 前言 1. 从安装到配置 2. 业务实现 3. 日志 4. 测试 5. 缓存使用 6.网络和通讯 7. ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- Asp.Net Core 轻松学-多线程之Task(补充)
前言 在上一章 Asp.Net Core 轻松学-多线程之Task快速上手 文章中,介绍了使用Task的各种常用场景,但是感觉有部分内容还没有完善,在这里补充一下. 1. 任务的等待 在使用 ...
随机推荐
- BZOJ 2073: [POI2004]PRZ [DP 状压]
传送门 水题不解释 这道题的主要目的在于记录一个枚举子集的技巧 #include <iostream> #include <cstdio> #include <cstri ...
- SDN第五次上机作业
作业链接 1.建立拓扑,并连接上ODL控制器. 2.利用ODL下发组表.流表,实现建议负载均衡 查看s2接收的数据包都被drop掉了 在s1中下发组表 在s1中下发流表使组表生效 下发流表覆盖S2中d ...
- 新闻热词:从爬虫到react native应用
背景 由于只想了解当天新增的top热词,减少过多信息干扰,打算做一款app实现这个功能. 架构: 热词抓取 -> mysql <=> nodejs <=> nginx & ...
- 统计输入的汉字,数字,英文,other数量
主要用正则表达式在完成对汉字,数字,英文数量的验证. import java.util.Scanner; /* * 统计汉字,数字,英文,other * */ public class Test { ...
- ubuntu python3.6 找不到_sqlite3
sudo apt-get install libsqlite3-dev 然后重新编译python: sudo ./configure --with-ssl sudo make -j8 sudo mak ...
- 深度学习优化算法Momentum RMSprop Adam
一.Momentum 1. 计算dw.db. 2. 定义v_db.v_dw \[ v_{dw}=\beta v_{dw}+(1-\beta)dw \] \[ v_{db}=\beta v_{db}+( ...
- EmguCv“线段” 结构类型学习
1. 文件所在 Namespace: Emgu.CV.Structure Assembly: Emgu.CV (in Emgu.CV.dll) Version: 3.0.0.2157 (3.0.0.2 ...
- SpringBoot+Mybatis+PageHelper简化分页实现
前言 经过一段时间的测试和修改PageHelper插件逐渐走到了让我觉得靠谱的时候,它功能的就是简化分页的实现,让分页不需要麻烦的多写很多重复的代码. 已经加入我的github模版中:https:// ...
- 用Postman做自动化测试的功能
自动化测试应该在桌面应用有该功能,在chrome的插件不知道有没有,我也没装chrome版的Postman Postman工具介绍图 上面这张就是Postman的操作界面.一开始我就是这样做简单的数据 ...
- 依赖Aspose.Cells Excel 导出
public static void SaveExcel() { //新建工作簿 Workbook workbook = new Workbook(); //工作簿 Worksheet sheet = ...