返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >AspNetCore中的中间件详解
  • 292
分享到

AspNetCore中的中间件详解

AspNetCore中间件AspNet中间件 2023-05-20 05:05:10 292人浏览 安东尼
摘要

目录1 什么叫做中间件?2 请求短路与中间件顺序3 中间件配置方法Use、Run、Map3.1Use 方法配置中间件3.2Run 方法配置中间件3.2Map 方法配置中间件4 自定义

1 什么叫做中间件?

ASP.net core处理请求的方式看做是一个管道,中间件是组装到应用程序管道中用来处理请求和响应的组件。通常是一个可重用的类方法
每个中间件可以:
(1)选择是否将请求传递给管道中的下一个组件。
(2)可以在调用管道中的下一个组件之前和之后执行业务逻辑。

其中关于请求管道配置的一个重要方法在startup中的Configure(IApplicationBuilder app, IWEBHostEnvironment env)方法。可用Use、Map、Run方法来配置需要使用的中间件。通常使用
IApplicationBuilder的拓展方法来配置请求管道,加入指定的中间件。

IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);
中间件类的本质其实是委托类

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //判断是否为开发环境
            if (env.IsDevelopment())
            {
                //使用异常开发页面中间件
                app.UseDeveloperExceptionPage();
            }
            //静态文件中间件
            app.UseStaticFiles();
            //Http请求转https请求
            app.UseHttpsRedirection();
            //身份验证
            app.UseAuthentication();
            //相较于netcore2来说,Routing 中间件是拆分出来的,原来是属于mvc中间件的一部分
            app.UseRouting();
            //端点中间件,请求处理路径,结合Routing中间件一起使用的
            app.UseEndpoints(endpoints =>
            {
                //当请求"/"时,响应输出HelloWorld【可通过lamda表达式进行配置】
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
                //请求路径匹配到 /home/index/1 这种路径时,将会到指定的handler处理器上,默认会处理到
                endpoints.MapControllerRoute("default","/{controller=home}/{action=index}/{id?}");
            });
        }

2 请求短路与中间件顺序

请求会按照顺序依次经过每个加入管道的中间件,值得注意的是,中间件可以决定是否将请求交给下一个委托,当中间件拒绝将请求传递到下一个中间件时,叫做请求短路,可以避免不必要的工作。
中间件的执行与调用的顺序有关,在响应式以相反的顺序返回。请求在每一步都有可能短路,所以需要正确的添加中间件,如异常处理的中间件,需要放在请求管道的前面,这样就可以一开始捕获异常,以及后面中间件中可能发生的异常,做出返回处理。

3 中间件配置方法Use、Run、Map

asp.net 中的核心请求管道是通过一个个请求委托串联而来的,具体是通过IApplicationBuilder的Use、Run、Map方法来实现的。

在讲解中间件配置方法之前,需要了解什么是RequestDelegate、和代码语言描述的中间件Func<RequestDelegate, RequestDelegate> middleware

    //一个能处理请求的方法
    public delegate Task RequestDelegate(HttpContext context);
   //中间件原生定义,委托,输入是一个RequestDelegate,输出也是一个RequestDelegate,
    Func<RequestDelegate, RequestDelegate> middleware = new Func<RequestDelegate, RequestDelegate>((RequestDelegate requestdelegate) =>
        {
            return new RequestDelegate(async (context) =>
            {
                await context.Response.WriteAsync("接收1个带RequestDelegate类型的参数,返回RequestDelegate类型的委托");
            });
        });
  // 上述中间件的定义代码可根据lamda表达式规则进行缩写
   Func<RequestDelegate, RequestDelegate> middleware = new Func<RequestDelegate, RequestDelegate>((RequestDelegate requestdelegate) =>
        {
            return new RequestDelegate(async (context) =>
            {
                await context.Response.WriteAsync("接收1个带RequestDelegate类型的参数,返回RequestDelegate类型的委托");
            });
        });
   Func<RequestDelegate, RequestDelegate> middleware = (request=>{
        return new RequestDelegate(async (context) =>
            {
                await context.Response.WriteAsync("接收1个带RequestDelegate类型的参数,返回RequestDelegate类型的委托");
            });
   });

3.1Use 方法配置中间件

//增加中间件到请求管道中
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware);

Use 扩展可以使用两个重载:
一个重载采用 HttpContext 和 Func < Task >。 不使用任何参数调用 Func< Task >。

     app.Use(async (context, next) =>
     {
        await context.Response.WriteAsync(" Rquest The first middleware");
        //调用下一个中间件
        await next.Invoke();
        await context.Response.WriteAsync(" Response The first middleware");
    });

另一个重载采用 HttpContext 和 RequestDelegate。 通过传递 HttpContext 调用 RequestDelegate。
优先使用后面的重载,因为它省去了使用其他重载时所需的两个内部每请求分配。

    app.Use(next =>
      {
          return new RequestDelegate(async context =>
          {
             await context.Response.WriteAsync(" Rquest The first middleware");
             await next.Invoke(context);
             await context.Response.WriteAsync(" Response The first middleware");
           });
      }
   );

上面两种方法实现的功能一致。值得注意的是,next参数表示管道中的下一个中间件。通过不调用下一个中间件,会导致请求短路或中断,所以需要谨慎的选择是否需要调用下一个中间件。

3.2Run 方法配置中间件

   public static void Run(this IApplicationBuilder app, RequestDelegate handler);

Run 方法配置请求管道时,会使得请求管道短路,因为它不调用下一个请求。因此Run方法一般只在管道的底部使用。

  app.Run( async context=> {
        await context.Response.WriteAsync(" Rquest The final middleware");
  });

3.2Map 方法配置中间件

//pathMatch 请求路径匹配字符串
//configuration 符合匹配规则时采取的 请求处理逻辑.
//configuration 是一个无返回,请求参数类型为 IApplicationBuilder的回调函数。
public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action<IApplicationBuilder> configuration);

Map 方法是一种可以基于请求路径的不同来配置分支中间件。

 app.Map("/secondturl", appBuilder => {
   appBuilder.Run(async context =>
    {
         await context.Response.WriteAsync(" the request'url is  secondturl" + "\n");
         });
    });

且可以在嵌套使用Map方法去配置分支中间件

4 自定义中间件

虽然中间件的本质是一个Func<RequestDelegate, RequestDelegate> middleware 对象,
中间件的类型可分为两种,下面自定义实现以及记录请求IP地址的中间件

弱类型中间件
(1) 定义Ip中间件

   public class RequestIpMiddleware
    {
        private readonly RequestDelegate requestDelegate;
        public RequestIpMiddleware(RequestDelegate requestDelegate) {
            this.requestDelegate = requestDelegate;
        }
        public async Task Invoke(HttpContext context) {
            context.Response.WriteAsync("The Request Ip is " + context.Request.HttpContext.Connection.RemoteIpAddress.ToString()+"\n");
            //调用下一个请求中间件
            await requestDelegate.Invoke(context);
        }
    }

(2)增加Use的拓展方法

    /// <summary>
    /// 调用中间件的扩展方法
    /// </summary>
    public static class MiddlewareExtensions
    {
        /// <summary>
        ///this 关键字不能省略
        /// </summary>
        /// <param name="app"></param>
        /// <returns></returns>
        public static IApplicationBuilder UseIpMiddleware( this IApplicationBuilder app ) 
        {
           return  app.UseMiddleware<RequestIpMiddleware>();
        }
    }

(3)Configure方法中使用该中间件

     app.UseIpMiddleware();

强类型中间件

可以在Use方法中调用这个匿名内部类,但是最好是将中间件定义成一个强类型,利于阅读,且符合编程习惯。
IApplicationBuilder 提供了一种拓展方法来配置强类型的中间件

public static IApplicationBuilder UseMiddleware<TMiddleware>(this IApplicationBuilder app, params object[] args);
    /// <summary>
    /// 自定义中间件 
    /// </summary>
    public class IPMiddleware : IMiddleware
    {
        /// <summary>
        /// IMiddleware接口定义了唯一的InvokeAsync方法,用来实现对请求的处理。
        /// </summary>
        /// <param name="context"> 当前请求上下文</param>
        /// <param name="next">下一个请求requestDelegate</param>
        /// <returns></returns>
        public Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            //获取请求的IP
            var ip = context.Request.HttpContext.Connection.RemoteIpAddress.ToString();
            context.Response.WriteAsync("IP is "+ip+"\n");
            //调用下一个中间件
            return  next.Invoke(context);
        }
    }

值得注意的是在使用这个中间件时,需要将当前中间件注入到容器中,否则请求管道中的这个中间件无法生效。

到此这篇关于AspNetCore中的中间件详解的文章就介绍到这了,更多相关AspNetCore中间件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: AspNetCore中的中间件详解

本文链接: https://lsjlt.com/news/213886.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • AspNetCore中的中间件详解
    目录1 什么叫做中间件?2 请求短路与中间件顺序3 中间件配置方法Use、Run、Map3.1Use 方法配置中间件3.2Run 方法配置中间件3.2Map 方法配置中间件4 自定义...
    99+
    2023-05-20
    AspNetCore中间件 AspNet中间件
  • express的中间件basicAuth详解
    basicAuth中间件为网站添加身份认证功能.在使用了该中间件后, 用户访问网站时必须输入用户名与密码,在用户输入了用户名与密码并通过验证之后才能访问网站. 当用户输入的用户名和密码符合条件,中间件会返回...
    99+
    2022-06-04
    详解 中间件 express
  • express的中间件bodyParser详解
    bodyParser用于解析客户端请求的body中的内容,内部使用JSON编码处理,url编码处理以及对于文件的上传处理. 下面是一个文件上传的例子. 建立一个1.html页面 <!DOCTYPE ...
    99+
    2022-06-04
    详解 中间件 express
  • express的中间件cookieParser详解
    cookieParser中间件用于获取web浏览器发送的cookie中的内容.在使用了cookieParser中间件后, 代表客户端请求的htto.IncomingMessage对象就具有了一个cookie...
    99+
    2022-06-04
    详解 中间件 express
  • 详解ASP.NETCore中间件Middleware
    本文为官方文档译文,官方文档现已非机器翻译 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/...
    99+
    2024-04-02
  • Laravel中间件的使用详解
    目录一:创建中间件二:前置和后置中间件1:前置中间件2:后置中间件三:注册中间件1:注册全局中间件2:为路由分配中间件3:中间件组4:排序中间件5:中间件参数6:Terminable...
    99+
    2023-02-08
    Laravel中间件使用 Laravel中间件
  • node中koa中间件机制详解
    koa koa是由express原班人马打造的一个更小、更富有表现力、更健壮的web框架。 在我眼中,koa的确是比express轻量的多,koa给我的感觉更像是一个中间件框架,koa只是一个基础的架子,需...
    99+
    2022-06-04
    详解 中间件 机制
  • 数据库中间件详解
    导读:本文详细介绍了中间件,主要从数据库拆分过程及挑战、主流数据库中间件设计方案、读写分离核心要点、分库分表核心要点展开说明。  1. 数据库拆分过程及挑战 互联网当下的数据库拆分过程...
    99+
    2024-04-02
  • express文件上传中间件Multer详解
    前言 Express默认并不处理HTTP请求体中的数据,对于普通请求体(JSON、二进制、字符串)数据,可以使用body-parser中间件。而文件上传(multipart/form-data请求),可以基...
    99+
    2022-06-04
    详解 文件上传 中间件
  • node.js 中间件express-session使用详解
    本文介绍的关于node.js中间件express-session的相关内容,分享出来供大家从参考学习,下面来一起看看详细的介绍: 一、为什么使用session? session运行在服务器端,当客户端第...
    99+
    2022-06-04
    详解 中间件 js
  • Golang中间件设计示例详解
    目录什么是中间件动手设计中间件代码处理framework/core.goframework/group.goframework/node.goframework/context.go...
    99+
    2023-05-19
    Golang中间件设计 Golang HTTP服务
  • NodeJs Express中间件超详细讲解
    目录什么是中间件现实生活中的例子Express 中间件的调用流程Express 中间件的格式next 函数的作用定义中间件函数全局生效的中间件定义全局中间件的简化形式中间件的作用定义...
    99+
    2024-04-02
  • 详解Node.js中间件是怎样工作的
    目录什么是 Express 中间件?编写 Express 中间件的要求Express中间件:基础中间件解决什么问题?为什么要用它?中间件函数是什么样的?中间件链Express中间件的...
    99+
    2024-04-02
  • nodejs处理图片的中间件node-images详解
    Cross-platform image decoder(png/jpeg/gif) and encoder(png/jpeg) for Node.js node.js轻量级跨平台图像编解码库 var...
    99+
    2022-06-04
    详解 中间件 图片
  • 详解React中组件之间通信的方式
    一、是什么 我们将组件间通信可以拆分为两个词: 组件 通信 回顾Vue系列的文章,组件是vue中最强大的功能之一,同样组件化是React的核心思想 相比vue,...
    99+
    2024-04-02
  • 一文详解Golang的中间件设计模式
    目录背景Demo验证结论背景 记录一下自己在go开发和学习上的一些笔记 最近在看一些rpc框架的使用原理和源码的时候,对中间件的实现非常感兴趣,然后也看了一下grpc的中间件的用法,...
    99+
    2023-03-06
    Golang中间件设计模式 Golang中间件 Go 中间件
  • jQuery中绑定事件的命名空间详解
    在没有看到这篇 文章之前,我一直不知道原来bind也可以有命名空间。事实上,我看完这篇文章后,再去翻了一下手册,也才发现了一点点的注释。但手册也仅仅是一句话就带 过去了。没有过多的深...
    99+
    2022-11-21
    jQuery 绑定事件
  • 详解Angular组件之中间人模式
    目录一、中间人模式二、例子1、报价组件上加购买按钮2、父组件接收处理事件3、下单组件4、运行结果三、使用服务作为中间人一、中间人模式 该组件树中除了组件1以外,每个组件都有一个父组...
    99+
    2024-04-02
  • Node.js使用Middleware中间件教程详解
    目录中间件依赖注入应用中间件路由通配符中间件消费者路由排除函数式中间件多个中间件全局中间件中间件 中间件是一个在路由处理程序之前被调用的函数。中间件函数可以访问请求和响应对象,以及应...
    99+
    2023-05-15
    Node.js Middleware Node.js 中间件
  • go语言gin框架中间件详解
    目录1、gin框架限流中间件2、gin框架跨域中间件 3、gin框架数据库中间件4、gin框架redis中间件5、gin框架es中间件6、gin框架rabbitMQ中间件7...
    99+
    2023-05-16
    go语言gin框架中间件 gin框架中间件 go gin框架中间件 go 中间件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作