菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

中间件(1)

4533人阅读 2022/2/10 10:12 总访问:961082 评论:0 收藏:0 手机
分类: .net core

前言

ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件。中间件按照装配的先后顺序执行,并决定是否进入下一个组件。中间件管道的处理流程如下图(图片来源于官网):

image
管道式的处理方式,更加方便我们对程序进行扩展。

使用中间件

ASP.NET Core中间件模型是我们能够快捷的开发自己的中间件,完成对应用的扩展,我们先从一个简单的例子了解一下中间件的开发。

Run

首先,我们创建一个ASP.NET Core 应用,在Startup.cs中有如下代码:

  1. app.Run(async (context) =>
  2. {   
  3.     await context.Response.WriteAsync("Hello World!");
  4. });

这段代码中,使用Run方法运行一个委托,这就是最简单的中间件,它拦截了所有请求,返回一段文本作为响应。Run委托终止了管道的运行,因此也叫作终端中间件

我们再看另外一个例子:

  1. app.Use(async (context, next) =>
  2. {    //Do something here
  3.     
  4.     //Invoke next middleware
  5.     await next.Invoke();    
  6.     //Do something here
  7.     });

这段代码中,使用Use方法运行一个委托,我们可以在Next调用之前和之后分别执行自定义的代码,从而可以方便的进行日志记录等工作。这段代码中,使用next.Invoke()方法调用下一个中间件,从而将中间件管道连贯起来;如果不调用next.Invoke()方法,则会造成管道短路

Map和MapWhen

处理上面两种方式,ASP.NET Core 还可以使用Map创建基于路径匹配的分支、使用MapWhen创建基于条件的分支。代码如下:

  1. private static void HandleMap(IApplicationBuilder app){
  2.     app.Run(async context =>
  3.     {        await context.Response.WriteAsync("Handle Map");
  4.     });
  5. }
  6. private static void HandleBranch(IApplicationBuilder app){
  7.     app.Run(async context =>
  8.     {        var branchVer = context.Request.Query["branch"];   
  9.              await context.Response.WriteAsync($"Branch used = {branchVer}");
  10.     });
  11. }
  12. public void Configure(IApplicationBuilder app, IHostingEnvironment env){
  13.     app.Map("/map", HandleMap);
  14.     
  15.     app.MapWhen(context => context.Request.Query.ContainsKey("branch"),
  16.                HandleBranch);
  17.     
  18.     app.Run(async context =>
  19.     {        await context.Response.WriteAsync("Hello World!");
  20.     });
  21. }

上面的代码演示了如何使用Map和MapWhen创建基于路径和条件的分支。另外,Map方法还支持层级的分支,我们参照下面的代码:

  1. app.Map("/level1", level1App => {
  2.     level1App.Map("/level2a", level2AApp => {  
  3.       // "/level1/level2a" processing
  4.     });
  5.     level1App.Map("/level2b", level2BApp => {   
  6.       // "/level1/level2b" processing
  7.     });
  8. });

需要注意,使用 Map 时,将从 HttpRequest.Path 中删除匹配的Path,并针对每个请求将该线段追加到 HttpRequest.PathBase。例如对于路径

  1. /level1/level2a
,当在level1App中进行处理时,它的请求路径被截断为
  1. /level2a
,当在level2AApp中进行处理时,它的路径就变成
  1. /
了,而相应的PathBase会变为
  1. /level1/level2a

原:ASP.NET Core 中间件基本用法 - 拓荒者-NET - 博客园 (cnblogs.com)

评价

.Net Core中的中间件实战

什么是中间件?凡是app点出来的都是中间件,如下图所示今天就来制作一下中间件1,创建一个.netcore的web空项目2,创建一个Re...

asp.net core中间件与过滤器的区别

中间件和过滤器的作用很相似,但是针对的点不一样。过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter 和 Res...

关于中间件和过滤器

中间件(Middleware)的作用中间件的运行方式中间件(Middleware)和过滤器(Filter)的区别什么情况我们需要中间件怎么样...

中间件

今天我们记录一下中间件 ,看到下面那些代码, 我们就知道了://处理静态文件中间件 app.UseStaticFiles(); app.UseCooki...

NET Core 中间件(Middleware)和过滤器(Filter)的区别

前言平安夜快乐!未来可期,人间值得!储存阳光,必有远芳。心中有暖,又何惧人生荒凉!一、中间件(Middleware)的作用我...

NET Core 页面中使用户依赖注入+自定义中间件

记录一下 NET CORE 的自定义中间件,我们用的MVC在CORE中就是一个中间件,想用的时候添加就好了,今天简单记录一下CORE添加...

中间件与过滤器的区别

首先在core中中间件是以app开头,过滤器是以services开头.中间件的作用: 中间件就是在应用程序管道中的一个组件,用来拦截...

Net Core使用依赖注入应用过滤器+自定义中间件

圣诞节快乐过什么圣诞节哦,圣诞老人已经被我抓起来了。我们今天主要讲的是NET Core中的依赖注入数据,使用过滤器调用+自定...

identity server4身份验证中间件源码

通过下载ids4的源码来看,可以把相关的源码放到自己项目中,方便分析整个流程和进行一些个性化定制,下面贴一下身份验证中...

WebApi中间件框架注意事项

在写调用WebApi接口的中间件框架时,有些类型错误,需要记录一下。像这种code返回成功!出参却没有数据,错误原因有几种情...

异常处理中间件:区分真异常与逻辑异常

异常处理中间件:区分真异常与逻辑异常[TOC] 处理异常的方式 异常处理页异常处理匿名委托方法IExceptionFilterExceptio...

.net core 静态文件中间件

.net core 静态文件中间件[TOC] 静态文件中间件的能力 支持指定相对路径支持目录浏览支持设置默认文档支持多目录映射 目...

.NET CORE中间件实现用户IP地址记录

中间件与过滤器的区别https://www.tnblog.net/aojiancc2/article/details/2537创建中间件RequestIPMyMiddlewarepublicclass...

.NET CORE 3.1 URL 生成的使用,配合中间件

URL 生成:是指路由基于一系列路由值创建 URL 路径的过程。允许终结点与访问它们的 URL 之间存在逻辑分隔。常用方法GetPath...

.net core3.x中间件处理路由

.net core中可以使用中间件处理路由,如下在Configure直接使用://自定义中间件来实现一个路由 app.Use(next=>asynccon...

core 中间件

前言中间件和过滤器的作用很相似,但是针对的点不一样过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter 和 R...