一、什么是中间件

请求处理管道由一系列中间件组件组成。每个组件在 HttpContext 上执行操作,调用管道中的下一个中间件或终止请求。

详情请看另外一篇文章:白话管道中间件

下图是中间件的管道模型图,有点类似过滤器。

二、中间件可以用来做什么?

在我们的应用程序当中和业务关系不大的一些需要在管道中做的事情可以使用,比如身份验证,Session存储,日志记录,定时任务等。.NET自带很多中间件,比如身份认证中间件UseAuthorization,Session中间件等。并且中间件可以自定义。

三、自定义中间件

当系统自带的中间件不能满足我们需求时,我们可以自定义中间件来实现功能,比如自己开发的定时任务等。注册中间件的方式可以使用use和run,use可以快速注册中间件,而run是终端中间件,是中间件管道末尾,当注册该中间件后,后面的中间件将不再执行。下面介绍三种自定义中间件的方式。

1、自定义匿名中间件

自定义匿名中间件在Program.cs文件中就可以实现,可以通过use和run来自定义匿名中间件。案例如下:

app.Use(async (context, next) =>{    Console.WriteLine("测试匿名中间件");    await next();});//如果shi用app.run将在这里结束。

还可以通过useWhen创建子集中间件。如下代码

//UseWhen有点类似if,这里是如果访问/put或者/put/xxx会调用该中间件。app.UseWhen(context => context.Request.Path.StartsWithSegments("/put"), app =>{    app.Use(async (context, next) =>    {        Console.WriteLine("测试UseWhen匿名中间件");        await next();    });});

使用注意:如果有下一个中间件,一定记得调用next(),否则会导致管道短路,后面的中间件不再被执行;如果有response操作不能调用next(),否则会报错。

2、基于工厂的中间件

基于工厂中间件需要通过IMiddleware接口实现,然后在通过UseMiddleware注册后在Program.cs文件中依赖注入。代码如下:

 //通过实现IMiddleware接口  public class Middleware:IMiddleware    {        public async Task InvokeAsync(HttpContext context, RequestDelegate next)        {            //下一个之前执行            Console.WriteLine("测试基于工厂的中间件(欢迎公众号:DOTNET开发跳槽)");            await next(context);            //下一个中间件处理完之后执行            Console.WriteLine("基于工厂的中间件运行结束");        }    }        public static class MiddlewareExtensions    {        public static IApplicationBuilder Middleware(this IApplicationBuilder builder)        {          //需要注册一下才能使用            return builder.UseMiddleware<Middleware>();        }    }    //在Program.cs中注册和注入    builder.Services.AddSingleton<Middleware>();    app.Middleware();

3、基于约定中间件

主要通过RequestDelegate来实现管道传递,关键代码如下。

 public class TestMiddleware    {        public RequestDelegate _requestDelegate;        public TestMiddleware(RequestDelegate requestDelegate)        {            _requestDelegate = requestDelegate;        }        public async Task InvokeAsync(HttpContext context)        {            //下一个之前执行            Console.WriteLine("测试约定中间件开始,(欢迎公众号:DOTNET开发跳槽)");            await _requestDelegate(context);        }    }   //在Program.cs中注册   app.UseMiddleware<TestMiddleware>();

执行效果如下:

结语

本文讲述了自定义中间件的三种实现方式,自定义匿名中间件、基于工厂中间件和约定中间件。如果是比较小的功能,可以使用匿名中间件,比如过滤请求的链接;基于工厂中间件和约定中间件建议比较大的功能使用,从便利上来说推荐约定中间件。这是小编在使用中间件的个人总结,仅供参考。希望本文对你有所收获,对于自定义中间件你有啥看法,欢迎留言讨论或吐槽。

ASP.NET Core实现自定义中间件的三种方式的更多相关文章

  1. Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)

    一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...

  2. angularjs 自定义服务的三种方式

    angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...

  3. [转]Asp.net Mvc2中重构View的三种方式

    本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net ...

  4. 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10979161.html],谢谢! 尽管Android系统提供了不少控件,但是有很多酷炫效果仍然 ...

  5. ASP.NET Core 3.1 中间件

    参考微软官方文档 : https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1 ...

  6. ASP.NET Core错误处理中间件[2]: 开发者异常页面

    <呈现错误信息>通过几个简单的实例演示了如何呈现一个错误页面,该过程由3个对应的中间件来完成.下面先介绍用来呈现开发者异常页面的DeveloperExceptionPageMiddlewa ...

  7. ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化

    原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...

  8. ASP.NET Core 中文文档 第三章 原理(10)依赖注入

    原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...

  9. 如何在ASP.NET Core中自定义Azure Storage File Provider

    文章标题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p ...

  10. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger

    本篇是在上一篇的基础上添加日志功能,并记录NLog在Asp.Net Core里的使用方法. 第一部分:默认Logger支持 一.project.json添加日志包引用,并在cmd窗口使用 dotnet ...

随机推荐

  1. Android IO 框架 Okio 的实现原理,如何检测超时?

    本文已收录到  AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在上一篇文章里,我们聊到了 Square 开源的 I/O 框架 Okio 的三个 ...

  2. Vue27 scoped样式

    https://www.jianshu.com/p/d80383251fc5 1 简介 当我们在组件中写样式,vue最后会把所有样式合在一起,如果样式名称重复的话就会有问题 style标签上加scop ...

  3. python3中,//、/ 的区别

    //:地板除,返回整数结果 /:浮点数除法,返回浮点结果 例: print(3//2)  #输出1 print(3/2)  #输出1.5 拓展:判断水仙花数 # 题目:打印出所有的"水仙花数 ...

  4. Linux基础之用户、组和权限管理

    用户类别分为:普通用户.系统用户.登陆用户 用户标识:UserID, UID 是16bits二进制数字: 0-65535管理员:0普通用户:0-65536系统用户:1-499(CentOS6)1-99 ...

  5. JZOJ 2114. 【GDKOI2011】反恐任务

    \(\text{Problem}\) 给定一张无向图,\(q\) 次询问,删去一个点或一条相邻两点间的边,问两点是否连通 询问独立 \(\text{Solution}\) 明显的用圆方树把图变成树 然 ...

  6. CCRD_TOC_2007年12月_总第13期

    中信国健临床通讯 2007年12月, 总第13期 ACR2007专辑 目 录   类风湿关节炎 1.        来自CORRONA的数据:TNF抑制剂停用后临床获益仍持续存在 Lee SJ, et ...

  7. ASP.NET Core - 依赖注入(三)

    4. 容器中的服务创建与释放 我们使用了 IoC 容器之后,服务实例的创建和销毁的工作就交给了容器去处理,前面也讲到了服务的生命周期,那三种生命周期中对象的创建和销毁分别在什么时候呢.以下面的例子演示 ...

  8. CF1470E 题解 —— 询问分叉转构建虚树的复杂度证明

    简要题意:给定一个长为 \(n\) 的排列 \(p\) 和一个整数 \(c\le 4\),称排列 \(p'\) 合法当且仅当 \(p'\) 可以通过 \(p\) 翻转若干个不交的区间 \([l,r]\ ...

  9. MySQ安装装

    1.Linux安装 检查系统有没有之前安装过: rpm -qa | grep mysql 如果安装过卸载 rpm -e mysql // 普通删除模式 rpm -e --nodeps mysql // ...

  10. PACS系统各个功能介绍--九五小庞

    PACS系统是HIS系统的重要组成部分,医生可在电脑上查看患者的医学影像报告. ■ 支持心电DICOM,心电图浏览和处理(显示格式.纸速.增益.滤波.测量等). ■ 支持MPR.CPR.MIP.SSD ...