首页 > 编程语言 >ASP.NET Core - 自定义中间件

ASP.NET Core - 自定义中间件

时间:2023-02-18 11:57:10浏览次数:64  
标签:Core ASP 自定义 app 中间件 context NET

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

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

image

其实对于中间件的封装,可以不实现某个接口,但是它有一套约定的规则。
(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() 方法进行注册的。在这个过程中,会通过反射等手段通过我们封装好的中间件类生成一个委托。

image

之后就是配置使用了,在 入口文件中将原本的 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();

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

image



ASP.NET Core 系列:
目录:ASP.NET Core 系列总结
上一篇:ASP.NET Core - 请求管道与中间件

标签:Core,ASP,自定义,app,中间件,context,NET
From: https://www.cnblogs.com/wewant/p/17107516.html

相关文章

  • 3 .NET Core笔试题
    1.什么是ASP.NETCore?2.ASP.NETCore中AOP的支持有哪些?3.ASP.NETCoreFilter的注册方式有哪些?4.ASP.NETCoreFilter如何支持依赖注入?5.ASP.NETCore如何和读取配......
  • mormot2中间件
    mormot2中间件中间件同一份pascal源码,同时支持在DELPHI和LAZARUS下面开发编译。 DELPHI编译目标平台WIN32,WIN64,LINUXINTEL64位CPU,主要是WINDOWS平台,因为DELPHI在W......
  • 2 .NET Core笔试题
    1.说说在Linux系统部署ASP.NETCore项目的步骤。2.说说热重载是什么。3.如何理解鉴权和授权两个词4.说说.NET7包含了几大方向的开发?5.如何理解云原生?6.ASP.NETCore应......
  • helm 之 自定义values
    在第一节中只会使用chart的默认配置选项。很多时候,我们需要自定义chart来指定我们想要的配置。第一步查看chart中定义的valueshelmshowvaluesbitnami/mysql[roo......
  • 【MybatisPlus】条件构造器Wrapper、分页查询、自定义SQL、Service层接口、代码生成器
    MybatisPlus基础篇(目录)1.条件构造器Wrapper1.1概述​ 我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器Wrapper。使......
  • uni-app:nvue和vue均引入自定义字体文件(hbuilderx 3.6.18)
    一,复制字体文件到static目录下,如图: 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里......
  • 自定义微信小程序主入口3秒钟广告页面
    实现思路:写一个定时器,绑定一个数据,这里使用的是miao,初始值为3。在进入页面时开始执行定时器,每秒执行一次miao-1操作。this.time=setInterval(function(){t......
  • 小程序静默登录, 自定义Promise.all实现业务逻辑的封装
    前言做了一个小程序,里面涉及到用户授权以及登录的情况,初次登录需要获取用户信息,然后再走登录流程,后续就不需要用户授权了,就可以直接走登录流程了同时有的数据......
  • vue3 、typescript环境, props自定义类型propType
    vue3、typescript环境,props自定义类型propType//子组件的props类型是复杂的类型的时候,可以用propType进行强制类型转换//eg复杂函数,对象数组,对象的类型检查props:{......
  • .NetCore6程序部署到Docker上
    使用Docker部署应用程序首先确保已经安装Docker 桌面软件,如下图: 然后,把需要部署到Docker上面的项目,咱们先添加Docker的支持,启动项目右键 -> 添加 -> Docker支持,选......