ASP.NET Core实现自定义中间件的三种方式
一、什么是中间件
请求处理管道由一系列中间件组件组成。每个组件在 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实现自定义中间件的三种方式的更多相关文章
- Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)
一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...
- angularjs 自定义服务的三种方式
angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...
- [转]Asp.net Mvc2中重构View的三种方式
本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net ...
- 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍
前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10979161.html],谢谢! 尽管Android系统提供了不少控件,但是有很多酷炫效果仍然 ...
- ASP.NET Core 3.1 中间件
参考微软官方文档 : https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1 ...
- ASP.NET Core错误处理中间件[2]: 开发者异常页面
<呈现错误信息>通过几个简单的实例演示了如何呈现一个错误页面,该过程由3个对应的中间件来完成.下面先介绍用来呈现开发者异常页面的DeveloperExceptionPageMiddlewa ...
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- ASP.NET Core 中文文档 第三章 原理(10)依赖注入
原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...
- 如何在ASP.NET Core中自定义Azure Storage File Provider
文章标题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
本篇是在上一篇的基础上添加日志功能,并记录NLog在Asp.Net Core里的使用方法. 第一部分:默认Logger支持 一.project.json添加日志包引用,并在cmd窗口使用 dotnet ...
随机推荐
- Python标准库pathlib及实例操作
Python标准库pathlib及实例操作 https://docs.python.org/zh-cn/3.9/library/pathlib.html 官网 讲的比较好的文章 https://zhu ...
- Django-Ajax、form组件
1.Ajax 1.AJAX:不是新的编程语言,而是一种使用现有标准的新方法,我们目前学习的是jQuery版本.特点:异步提交,局部刷新. 2.AJAX 最大的优点是在不重新加载整个页面的情况下,可以与 ...
- WPF跨平台方案?
Avalonia XPF 通过我们的跨平台UI框架,释放现有WPF应用程序的全部潜力,使WPF应用程序能够在macOS和Linux上运行,而不需要昂贵和有风险的重写. 工作原理 我们使用 Fork o ...
- Javaweb-Tomcat(安装+配置环境)
Tomcat跟着教程,但是在bin目录下点击startup只能闪退的总结 1.先下载 直接搜tomcat下载就可以了(free) 2.解压到你想要的文件中 3.直接进入bin目录,找startup.b ...
- IDEA新手使用教程【详解】
IDEA是一款功能强悍.非常好用的Java开发工具,近几年编程开发人员对IDEA情有独钟. Intellij Idea使用技巧总结 1.如何设置通过鼠标滑轮改变编辑器字体大小 2.如何设置自动导包功能 ...
- 学习Java Day16
今天学习静态数据的使用
- 五:spring boot
五.spring boot 通过springboot可以快速的搭建一个基于ssm框架的Java application,简单配置,自动装配. JavaConfiguration用java类来替代xml ...
- 用 HTTP 协议下载资源(WinINet 实现)
用 HTTP 协议下载资源(WinINet 实现) WinINet 使用 HTTP 协议下载资源的流程 相关函数 InternetCrackUrl 解析 URL BOOL InternetCrackU ...
- JumpServer(v2.28.6) 堡垒机常见问题
JumpServer 各组件查询日志方法 # 默认持久化目录 /data/jumpserver ls -al /data/jumpserver/core/logs ls -al /data/jumps ...
- 【NOIP2012提高组】开车旅行
题目 到处都有 闲话 碰巧考场上出了 \(Noip\) 原题 然后这题自然而然想到 预处理一个点开始分别由 \(A,B\) 驾驶会走到的下一个点 然后用预处理的数组求答案 当然你会发现 \(X=X0\ ...