一、什么是中间件

请求处理管道由一系列中间件组件组成。每个组件在 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. 艰难的 debug 经历,vscode 无法获取远程环境 ssh 报错,windows 11 ssh

    背景介绍 要做系统结构实验,学校和华为云合作使用华为云的 aarch64 裸机,需要使用 ssh 远程开发,笔者为了追求良好的开发体验,决定使用 vscode 开发,实验环境配置过程中遇到了两个问题, ...

  2. 20个 Git 命令玩转版本控制

    想要在团队中处理代码时有效协作并跟踪更改,版本控制发挥着至关重要的作用.Git 是一个版本控制系统,可以帮助开发人员跟踪修订.识别文件版本,并在必要的时候恢复旧版本.Git 对于有一定编程经验的用户来 ...

  3. 云萌 V2.6.3.0 win10,win11 Windows永久激活工具

    Windows如果一直不激活,其实用起来问题也不大,除了无法修改壁纸.颜色.锁屏.主题以及无法使用微软账号的同步功能等之外,绝大多数的基本功能都可以正常使用.不过该激活还是得激活的.别的不说,就桌面右 ...

  4. 高效字符串匹配算法——BM 算法详解(C++)

    定义 BM 算法是由 Boyer 和 Moore 两人提出的一种高效的字符串匹配算法,被认为是一种亚线性算法(即平均的时间复杂度低于线性级别),其时间效率在一般情况下甚至比 KMP 还要快 3 ~ 5 ...

  5. ROS入门:服务

    服务端实现一个加法,将结果反馈给客户端 客户端将要计算的和的两个数发给服务的. 1.自定义服务数据 创建一个srv文件:AddTwoInts.srv int64 a int64 b --- int64 ...

  6. 3 .NET Core笔试题

    1.什么是ASP.NET Core? 2.ASP.NET Core 中AOP的支持有哪些? 3.ASP.NET Core Filter的注册方式有哪些? 4.ASP.NET Core Filter如何 ...

  7. 学习Java Day24

    今天明白了 一.面向对象(面向过程) 1. 面向对象 找对象(封装了过程)来干. 例如:洗衣服(洗衣机就是对象). 2. 面向对象思想特点 是一种更符合我们思想习惯的思想. 可以将复杂的事情简单化.  ...

  8. [java安全基础 02]反射

    java反射 这一篇和上一篇对不上,这里是补一下java反射知识点 一个需求引出反射 请根据配置文件re.properties指定信息,创建Cat对象并调用方法hi classfullpath=com ...

  9. Destroying Roads

    题目链接 \(Destroying\) 分析 又是变形了的最短路 我们可以考虑哪些道路必须被保留 然后枚举两个起点到终点重复的道路 考虑公合法用这些道路就可以了 \(Code\) #include&l ...

  10. Openfoam UPstream类探索

    前言 上篇文章我们大体捋顺了Pstream类,但上篇没有讲到的是Pstream类很多东西是从UPstream类继承来的 这次我们大体看一下UPstream类,以避免Pstream类内很多继承来的东西不 ...