当前位置: 首页 > article >正文

ASP.NET Core - 自定义中间件

ASP.NET Core - 自定义中间件

上一章讲了请求管道与中间件的基本概念和工作模式,也介绍了 ASP.NET Core 中内置的中间件,这一章介绍一下如何自定义中间件,这是很常用也很重要的内容,日常工作中很多场景我们都可以自定义自己的中间件,通过对请求管道进行拦截执行我们自己的业务逻辑,实现各种需求。这也是 ASP.NET Core 框架下的一种最基本的 AOP 编程方式。

中间件本质上是一个委托,上一章的例子中我们将中间件的代码逻辑通过Use()、Run()、Map() 等方法写在了入口文件中,这样很不优雅。我们可以对这些代码进行封装,最简单的封装方式,就是通过一个静态类将相关的代码写成静态方法,在 Use() 等方法中只需要传入静态方法即可。但是这种方法一样不够优雅,我们可以模仿微软内置中间件和一些第三方组件提供的中间件的封装方式。例如,静态文件中间件的实现源码:

在这里插入图片描述
其实对于中间件的封装,可以不实现某个接口,但是它有一套约定的规则。
(1) 中间件类名必须是 XXXMiddleware 格式
(2) 中间件类中必须有 public Task Invoke(HttpContext context) 方法

所以对于上一章节的例子中的代码,我们可以进行以下的优化

namespace MiddlewareSample.Middlewares
{
    public class HelloMiddleware
    {
        private readonly RequestDelegate _next;
        // 注入相应的依赖,这里是下一个中间件的委托,如果有其他依赖项需要用到,也可以从构造函数注入
        public HelloMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            await context.Response.WriteAsync("Hello Middlerware1 ! ");
            if (context.Request.Query.TryGetValue("query", out var query))
            {
                await context.Response.WriteAsync(query);
            }
            // 调用下一个中间件
            await _next(context);
            await context.Response.WriteAsync("End Middleware1 ! ");
        }
    }
}

之后再提供一个扩展方法,以供使用者便捷地进行注册使用。

using MiddlewareSample.Middlewares;

namespace Microsoft.AspNetCore.Builder
{
    public static class HelloExtensions
    {
        public static IApplicationBuilder UseHello(this IApplicationBuilder app) 
        { 
            if(app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }
            // 中间件的注册方式
            app.UseMiddleware<HelloMiddleware>();
            return app;
        }
    }
}

这里使用了另一种中间件注入的方式,通过查看源码,可以看到最终也是调用了 Use() 方法进行注册的。在这个过程中,会通过反射等手段通过我们封装好的中间件类生成一个委托。

在这里插入图片描述
之后就是配置使用了,在 入口文件中将原本的 Use() 方法替换成扩展方法。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseDefaultFiles();
app.UseStaticFiles();

app.UseHello();
app.Run(async context =>
{
    await context.Response.WriteAsync("Hello last Middleware ! ");
});

app.Run();

最终的执行结果是一样的。

在这里插入图片描述



ASP.NET Core 系列:
目录:[ASP.NET Core 系列总结]

(https://blog.csdn.net/weixin_37648525/article/details/145125951?spm=1001.2014.3001.5502)
上一篇:ASP.NET Core — 请求管道与中间件


http://www.kler.cn/a/501746.html

相关文章:

  • 【Leetcode 热题 100】84. 柱状图中最大的矩形
  • vue的KeepAlive应用(针对全部页面及单一页面进行缓存)
  • 整数和浮点数的存储
  • 哈夫曼、算术、LZ编码
  • 【文件锁】多进程线程安全访问文件demo
  • 【API】免费调用Qwen-vl2对图像打标
  • (10)Ajax
  • Spring 核心指南(上):IoC 容器与配置方式详解
  • bert微调下游任务-情感分析
  • WRF模式与Python融合技术在多领域中的应用及精美绘图;Python助力WRF自动化运行、WRF模式前后处理等
  • 达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介
  • ASP.NET Core 中,Cookie 认证在集群环境下的应用
  • c# 和python封装起保停
  • 功能篇:mybatis中实现缓存
  • JSON头文件调用
  • Fastapi0.115.6之Tortoise ORM0.23.0基本增删改查大全【亲测可用,仅供参考】
  • AIDD-人工智能药物设计-通过组合生物合成产生新的类似物的抗真菌费尔南型三萜多聚类素的生物合成表征
  • AI多模态论文解读:LLaVA-CoT:让视觉语言模型逐步推理
  • uni-app持久化登录简单实现
  • 八、系统托盘与配置面板
  • springmvc前端传参,后端接收
  • StarRocks Awards 2024 年度贡献人物
  • 《解锁鸿蒙系统AI能力,开启智能应用开发新时代》
  • 【GoLand】无法debug 无法运行
  • 【Orca】Orca - Graphlet 和 Orbit 计数算法
  • 《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》