一. 简介

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)的更多相关文章

  1. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  2. ASP.NET Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...

  3. Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...

  4. 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,

    第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...

  5. DotNetCore学习-3.管道中间件

    中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每个组件都可以选择是否将请求交给下一个组件,并在管道中调用下一个组件之前和之后执行一些操作. 请求委托被用来建立请求管道,并处理每一个HTT ...

  6. 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

    第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...

  7. 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

    第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...

  8. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  9. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

随机推荐

  1. rabbitMq 学习笔记(一)

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构. RabbitMQ 是采用 Erlang 语言实现 AMQP (Adva ...

  2. 彻底抛弃 jQuery ,不然还留着过年?

    我以前很喜欢 jQuery,而且说实话,我是先学jQuery,再学 JavaScript 的.所以我写这篇文章有点像是在背叛 jQuery. 我知道,关于为什么不应该用 jQuery 的文章已经汗牛充 ...

  3. wamp不能使用phpmyadmin,提示“You don't have permission to access /phpmyadmin/ on this server.”

    当你安装完成wamp后,打开localhost或ip时发现已经可以运行了 但想使用phpmyadmin时,发现提示如下内容: You don't have permission to access / ...

  4. QTableWidget表格属性

    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑 ui->tableWidg ...

  5. nginx的 ngx.var ngx.ctx ngx.req

    ngx.var 是获取 Nginx 的变量,需要经历字符串 hash.hash 表查找等过程. ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ct ...

  6. 【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 ...

  7. OpenSSL 下载和私钥证书、CERTIFICATE证书生成

    openssl 是生成私钥和公钥证书的重要工具. Windows如何安装OpenSSL: 官网:https://www.openssl.org/community/mailinglists.html  ...

  8. 用 Splashtop Wired XDisplay HD 让 ipad做电脑扩展屏幕__亲测有效

    参考: [1]https://blog.csdn.net/Tang_Chuanlin/article/details/86433152

  9. Fluter基础巩固之Dart语言详解<三>

    继续Dart语言的学习,这次过后下次就进入全新的Flutter的学习了,小小的激动.. 操作符重载: C++中也有,咱们来看一下在Dart中是如何来实现的: 比较简单. 异步[重要!]: async和 ...

  10. java JSONObject

    JSONObject.has("key")方法首先判断是否含有该key字段,如果不存在该字段,返回false;如果存在此字段,还判断了该字段的value值是否为null,如果val ...