第五节:管道中间件入门(Use、Run、Map)
一. 简介
1.中间件是一种装配到应用管道以处理请求和响应的组件,每个组件可以选择是否把请求传递到管道中的下一个组件、可在管道中的下一个组件的前后执行工作.请求管道中的每一个组件负责调用管道中的下一个组件(或者使管道短路).
经典的管道请求图:

2.当中间件短路的时候,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。
3.顺序:向Startup.Configure方法中添加常用中间件组件,需要按照下面的顺序,从而保证安全性、性能、功能。
异常/错误处理→ HTTP 严格传输安全协议→HTTPS 重定向→静态文件服务器→Cookie 策略实施→身份验证→会话→MVC。
public void Configure(IApplicationBuilder app)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
} // Use HTTPS Redirection Middleware to redirect HTTP requests to HTTPS.
app.UseHttpsRedirection(); // Return static files and end the pipeline.
app.UseStaticFiles(); // Use Cookie Policy Middleware to conform to EU General Data
// Protection Regulation (GDPR) regulations.
app.UseCookiePolicy(); // Authenticate before the user accesses secure resources.
app.UseAuthentication(); // If the app uses session state, call Session Middleware after Cookie
// Policy Middleware and before MVC Middleware.
app.UseSession(); // Add MVC to the request pipeline.
app.UseMvc();
}
4.中间件的三大核心方法,分别是:Use、Run、Map.
二. Use方法
1. 用途:Use可以将多个中间件连接在一起,实现在下一个中间件的前后执行操作,Use方法也可以使管道短路,即不调用next请求委托,此时和Run的作用一样。
2. 查看Use方法的源代码,参数为:Func<HttpContext, Func<Task>, Task> middleware,可以参考自己封装一个中间件, 如:MyMiddleware。
代码分享:
/// <summary>
/// 自定义一个中间件
/// </summary>
public class MyMiddleware
{
public Task DelegateMiddleware(HttpContext context, Func<Task> next)
{
context.Response.WriteAsync("MyOwinMiddle Start<br/>");
next.Invoke();
return context.Response.WriteAsync("MyOwinMiddle End<br/>");
}
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//1. Use用法
{
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("First Start<br/>");
//调用下一个中间件
await next.Invoke();
await context.Response.WriteAsync("First End<br/>");
});
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Second Start<br/>");
//调用下一个中间件
await next.Invoke();
await context.Response.WriteAsync("Second End<br/>");
});
//调用封装后的中间件
MyMiddleware myMiddleware = new MyMiddleware();
app.Use(myMiddleware.DelegateMiddleware); //没有调用next,它在此处的作用是使管道短路
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Third Start<br/>");
await context.Response.WriteAsync("Third End<br/>");
}); }
}
运行结果及分析:执行到next.Invoke(),调用下一个中间件。

三. Run方法
1. Run是一种约定,在某些中间件的可公开的管道末尾运行Run[Middleware]方法,表示终止请求。
代码分享:
//2. Run用法
{
app.Run(async context =>
{
await context.Response.WriteAsync("First Start<br/>");
await context.Response.WriteAsync("First End<br/>");
});
//不能执行下面代码,因为第一个Run直接终止了管道
app.Run(async context =>
{
await context.Response.WriteAsync("Second Start<br/>");
await context.Response.WriteAsync("Second End<br/>");
});
}
运行结果:

四. Map和MapWhen方法
1. 当请求满足某种规则,执行某个中间件,下面分享Map和MapWhen的代码
代码分享:
//3. Map用法
{
//http://localhost:5000/map1 访问
app.Map("/map1", appBulider => appBulider.Run(async context =>
{
await context.Response.WriteAsync("This is Map1<br/>");
}));
//http://localhost:5000/map2 访问
app.Map("/map2", appBulider => appBulider.Run(async context =>
{
await context.Response.WriteAsync("This is Map2<br/>");
}));
//当没有map1和map2的时候,访问下面的中间件
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
});
} //4. MapWhen用法
{
//http://localhost:5000/?userName=ypf 访问
app.MapWhen(context => context.Request.Query.ContainsKey("userName"),
appBulider => appBulider.Run(async context =>
{
var value = context.Request.Query["userName"];
await context.Response.WriteAsync($"this value is {value}");
}));
//没有拼接的时候访问下面
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
});
}
运行结果分析:如上述代码中的描述。
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
第五节:管道中间件入门(Use、Run、Map)的更多相关文章
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- ASP.NET Core 1.0中的管道-中间件模式
ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...
- Core 1.0中的管道-中间件模式
ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...
- 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,
第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...
- DotNetCore学习-3.管道中间件
中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每个组件都可以选择是否将请求交给下一个组件,并在管道中调用下一个组件之前和之后执行一些操作. 请求委托被用来建立请求管道,并处理每一个HTT ...
- 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框
第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...
- 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html
第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件.目录属性 shell数组简单用法 $( ) 和$ ...
随机推荐
- rabbitMq 学习笔记(一)
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构. RabbitMQ 是采用 Erlang 语言实现 AMQP (Adva ...
- 彻底抛弃 jQuery ,不然还留着过年?
我以前很喜欢 jQuery,而且说实话,我是先学jQuery,再学 JavaScript 的.所以我写这篇文章有点像是在背叛 jQuery. 我知道,关于为什么不应该用 jQuery 的文章已经汗牛充 ...
- wamp不能使用phpmyadmin,提示“You don't have permission to access /phpmyadmin/ on this server.”
当你安装完成wamp后,打开localhost或ip时发现已经可以运行了 但想使用phpmyadmin时,发现提示如下内容: You don't have permission to access / ...
- QTableWidget表格属性
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑 ui->tableWidg ...
- nginx的 ngx.var ngx.ctx ngx.req
ngx.var 是获取 Nginx 的变量,需要经历字符串 hash.hash 表查找等过程. ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ct ...
- 【Cookie】java.lang.IllegalArgumentException An invalid character [32] was present in the Cookie value
创建时间:6.30 java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie va ...
- OpenSSL 下载和私钥证书、CERTIFICATE证书生成
openssl 是生成私钥和公钥证书的重要工具. Windows如何安装OpenSSL: 官网:https://www.openssl.org/community/mailinglists.html ...
- 用 Splashtop Wired XDisplay HD 让 ipad做电脑扩展屏幕__亲测有效
参考: [1]https://blog.csdn.net/Tang_Chuanlin/article/details/86433152
- Fluter基础巩固之Dart语言详解<三>
继续Dart语言的学习,这次过后下次就进入全新的Flutter的学习了,小小的激动.. 操作符重载: C++中也有,咱们来看一下在Dart中是如何来实现的: 比较简单. 异步[重要!]: async和 ...
- java JSONObject
JSONObject.has("key")方法首先判断是否含有该key字段,如果不存在该字段,返回false;如果存在此字段,还判断了该字段的value值是否为null,如果val ...