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. 任务的等待 在使用 ...
随机推荐
- 洛谷 [P2420] 让我们异或吧
某两点之间的路径上所有边权的异或值即dis1^dis2--^disn. 由于x^y^y=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv. #include & ...
- POJ2891 Strange Way to Express Integers [中国剩余定理]
不互质情况的模板题 注意多组数据不要一发现不合法就退出 #include <iostream> #include <cstdio> #include <cstring&g ...
- BZOJ 1355: [Baltic2009]Radio Transmission [KMP 循环节]
1355: [Baltic2009]Radio Transmission Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 792 Solved: 535 ...
- 保存文件名至txt文件中,不含后缀
准备深度学习的训练数据时,可能会用到将图片文件名保存到txt文件中,所以用python实现了该功能.输入参数只设了两个,图片存放路径,和输出的txt文件名. 代码里写死了只识别.jpg格式,并不进行目 ...
- centos7下安装apache服务器httpd的yum方式安装
转自Clement-Xu的csdn博客 http://blog.csdn.net/clementad/article/details/41620631 Apache在Linux系统中,其实叫&qu ...
- checkbox/input文本框与文字对齐
3种方法都能实现checkbox文本框或radio文本框与文字对齐: <meta charset="utf-8"> <input style="vert ...
- 【JavaWeb】DbUtils入门之QueryRunner
DbUtils简介 根据官网的介绍,DbUtils是一种 JDBC Utility Component (翻译过来大概就是:JDBC实用部件),故名思意,和数据库操作有关 官网上的简介也称之为 JDB ...
- Java集合中的Map接口
jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...
- Selenium常用API用法示例集----下拉框、文本域及富文本框、弹窗、JS、frame、文件上传和下载
元素识别方法.一组元素定位.鼠标操作.多窗口处理.下拉框.文本域及富文本框.弹窗.JS.frame.文件上传和下载 元素识别方法: driver.find_element_by_id() driver ...
- 批处理文件:windows下关闭指定端口
@echo offsetlocal enabledelayedexpansionset /p port=please input port number:for /f "tokens=1-5 ...