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 ...
随机推荐
- 【学习日志】Cglib动态代理和JDK动态代理的对比
Cglib JDK Proxy 实现方式 生成被代理类的子类 通过被代理类实现的接口+反射 速度 慢(曾经快于JDK Proxy,但JDK Proxy几次迭代后逐渐落后) 快 限制 被代理类不能是 ...
- MongoDB Compass的安装及使用图文说明(非常详细)
1.下载 MongoDB Compass 预编译二进制包下载地址:https://www.mongodb.com/try/download/compass 2.安装 MongoDB Compass 的 ...
- 大三末java实习生一面凉经
在南京投了一些小公司,想找个实习,因为知道自己很菜,就收到了一家公司的面试. 面试一般在线上进行,我是在腾讯会议上进行的.面试官其实挺好的,一般不会为难你,因为他知道你是在校生不会懂那么多企业的技术. ...
- 学习Java Day9
今天学习了switch,以及bread和read_date的使用,还学习了大数
- SpringBoot集成Tomcat服务
目录 一.Tomcat集成 1.依赖层级 2.自动化配置 二.Tomcat架构 三.Tomcat配置 1.基础配置 2.属性配置类 3.配置加载分析 四.周期管理方法 1.控制类 2.核心方法 五.参 ...
- 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(7)-Charles苹果手机手机抓包知否知否?
1.简介 Charles和Fiddler一样不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求. Charles也能截获iOS设备发出的请求,比如 i ...
- Postgresql 二进制字符串函数和操作符
1.SQL 二进制字符串函数和操作符 函数 返回类型 描述 例子 结果 string || string bytea 字符串连接 E'\\\\Post'::bytea || E'\\047gres\\ ...
- net core 添加cors,解决跨域问题
ConfigureServices //允许跨域 services.AddCors(options => { options.AddPolicy("any", builder ...
- C++ cannot bind non-const lvalue reference of type ‘Dog&’ to an rvalue of type ‘Dog’
void function(Dog & d){ /************** } 调用这个函数,如果传参一个右值对象,临时对象,则会出现这个问题 一个临时对象的引用,这怎么想都不合理 从该函 ...
- 微信JS-SDK自定义分享接入的注意点
微信文档 ,https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html, 在用微信自定义分享,遇到了几个坑,记录一 ...