首页 > 编程语言 >Asp.NetCore 自定义中间件

Asp.NetCore 自定义中间件

时间:2023-06-05 17:05:14浏览次数:35  
标签:Asp 自定义 app await 中间件 next context Response

这节演示一下自定义中间件,第一节我们讲到,中间件的处理流程就像一个俄罗斯套娃,那这种俄罗斯套娃型的流程内部是如何实现的呢,下面请看代码。

    第一种写法是直接写在Configure方法中的,使用app.Use(委托)配合lambda表达式使用,适合很轻量级的中间件。

app.Use(async (context, next) =>
  {
      await context.Response.WriteAsync("CustomerMiddleWare1-in\n");
      await next();
      await context.Response.WriteAsync("CustomerMiddleWare1-out");
  });

微软约定中间件需要两个参数,一个是httpcontext上下文对象,一个是Task类型的委托。通过上下文对象,处理请求,通过委托传递上下文对象到下一个中间件(这也是套娃模式的由来)。

    这也限制了方法,必须是异步的async方法,调用next()之后,上下文对象发送给下一中间件了,该方法就会处于等待状态,直到后续的中间件处理完毕,返回后,再执行next()方法之后的代码。(关于同步和异步的有关知识,将在后续进行讲解)

    除了使用Use()方法,还有一种用法,这个方法有点特殊,因为它不存在next()方法传递上下文对象,它是请求管道的底,用于直接返回响应

//run 是终端中间件,他是没有next()方法的,只要进入这个中间件,后续的中间件都不会执行了,从它这里请求完毕原路返回 
 app.Run(async context =>
 {
      await context.Response.WriteAsync("I am End MiddleWare\n");
 });

 .NetCore 3.x推出了一个新的中间件,叫EndPoints

app.UseEndpoints(endpoints =>
 {
        endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
 });

  它跟Run()一样,是兜底的中间件,但是用法比较特殊了,微软给我们的默认配置就是直接路由到某一页面,一般是网站首页。

 下面看一下运行结果的演示,有如下三个中间件:

//use是添加中间中间件,就是处理完了,继续传给下一个中间件,它有next()委托
 app.Use(async (context, next) =>
 {
   await context.Response.WriteAsync("CustomerMiddleWare1-in\n");
   await next();
   await context.Response.WriteAsync("CustomerMiddleWare1-out");
 });
 app.Use(async (context, next) =>
 {
   await context.Response.WriteAsync("CustomerMiddleWare2-in\n");
   await next();
   await context.Response.WriteAsync("CustomerMiddleWare2-out\n");
 });
//run 是终端中间件,他是没有next()方法的,只要进入这个中间件,后续的中间件都不会执行了,从它这里请求完毕原路返回 
 app.Run(async context =>
 {
   await context.Response.WriteAsync("I am End MiddleWare\n");
 });

运行结果为:

Asp.NetCore 自定义中间件_自定义

 

 

  这很直观的反应了中间件的顺序执行,以及嵌套执行

 

 下面看一下如何定义一个真正的自定义中间件

    首先,我们要明确,微软规定的自定义中间件的要求

        1.具有类型为RequestDelegate参数的公共构造函数,这个参数就是请求委托,它在一个个的中间件中传递

         2.具有Invoke或者InvokeAsync的方法,该方法的返回值必须是Task,而且第一个参数必须是HttpContext

public class MyMiddleWare
    {
        private readonly RequestDelegate _next;

        public MyMiddleWare( RequestDelegate next )
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            //此处写中间件业务逻辑
            //然后调用next指向下一个中间件
            //调用next之前,属于请求部分的处理
            await _next(context);
            //next执行完毕之后,属于相应部分的处理
        }
    }

   定义完成以后,使用UseMiddleware<中间件>()将自定义中间件添加进来

app.UseMiddleware<MyMiddleWare>();

 但这样的用法,还是少了一点优雅与灵活性,我们可以通过扩展方法的形式,为IApplicationBuilder添加扩展方法,实现自定义中间件添加与配置的灵活应用(扩展方法在之前的文章中有讲)

public static class MyMiddleWareExtension
    {
        public static IApplicationBuilder UseMymiddleware(this IApplicationBuilder app)
        {
            return app.UseMiddleware<MyMiddleWare>();
        }
    }

这样的话,就可以直接调用方法添加中间件了

//使用扩展方法的形式,添加自定义中间件然后可以通过构造方法的形式,传递配置参数
 app.UseMymiddleware();

 初学者可对此做初步了解,对其中设计的代码语法知识,是必须要掌握的。另外,如果需要查看ASP.NetCore的源码,请访问https://github.com/dotnet/aspnetcore自行下载或克隆到本地

 

 这是我公众号二维码,最新的文章会同步至此



标签:Asp,自定义,app,await,中间件,next,context,Response
From: https://blog.51cto.com/u_4018548/6417923

相关文章

  • asp.net core NLog将日志写到文件
    1、安装Nlog包Install-PackageNLog.Extensions.Logging-Pre2、在项目添加nlog.config文件 2.1、nlog.config <?xmlversion="1.0"encoding="utf-8"?><nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http:......
  • Asp.NetCore Web应用程序中的请求管道和中间件
     你是否会迷惑当我们请求一个ASP.NetWeb应用程序以后,它是怎么处理这些请求的,后台是怎么工作的,今天就讲一下Asp.NetCoreWeb应用程序中的请求处理过程。    上一节,我们讲到,Startup文件中用来配置中间件(middleware),这个中间件就是用来处理请求的。那标题中的请求管道又是什么呢,......
  • asp.net core的输入模型验证
    数据验证特性RequiredAttribute:表示数据不能为空RegularExpressionAttribute:正则校验CompareAttribute:和某个属性比较RangeAttribute:表示在某个区间之内MaxAttribute:最大值MinAttribute:最小值StringLengthAttribute:验证字符串长度DataTypeAttribute:验证数据类型在Models页面下面新......
  • wpf 自定义 RadioButton.
    <StyleTargetType="RadioButton"x:Key="nav"><SetterProperty="Template"><Setter.Value><ControlTemplateTargetType="RadioButton">......
  • asp.net core 过滤器
         ......
  • 第四十八节:Core7.0中速率中间件详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • asp.net core从数据库生成实体类,修改实体类
    前言花了我2个小时,终于知道怎么更新.netcore里面的模型层了。。。虽然方法很不正规提示:以下是本篇文章正文内容,下面案例可供参考一、asp.netcore生成从数据库生成实体类1、新建.netcore类库项目我是用的vs2019,其他版本类似2、安装NuGet程序包,三个如下图所示打开NuGet程序包选......
  • pytorch 的 torchvision.datasets.ImageFolder 来自定义数据集
    importtorchvisionclassClassificationDataset(torchvision.datasets.ImageFolder): """ YOLOv5ClassificationDataset. Arguments root:Datasetpath """ def__init__(self,root): super().__init__(root=root)#调用了父类的......
  • 常用的开源自定义表单有哪几大优势特点?
    当前,办公已经进入流程化和自动化的阶段,要想跟随着社会发展,引用开源自定义表单工具可以使办公协作效率得到快速提升,它的灵活、便捷、易操作等特点,使得该表单工具深受当今职场的喜爱,是做好数据管理,提升办公表单制作效率和质量的得力助手。今天这篇文章就与大家一起分享常用的开源自......
  • 解绑自定义事件
    子组件中:  子组件:1)解绑一个自定义事件: 2)解绑多个自定义事件: 3)解绑所有的自定义事件: 销毁钩子也能解绑自定义事件: ......