聊聊 ASP.NET Core 中间件(三):如何创建自己的中间件?

简介: 聊聊 ASP.NET Core 中间件(三):如何创建自己的中间件?

前言

本质上,中间件类也是一个普通的 .NET 类,它不需要继承任何父类或者实现任何接口。

但是有几个约定:

  1. 需要有一个构造方法
  2. 构造方法至少要有一个 RequestDelegate 类型的参数,用来指向下一个中间件。
  3. 需要定义一个名字为 Invoke 或 InvokeAsync 的方法
  4. 此方法中至少有一个 HttpContext 类型的参数
  5. 此个方法的返回值必须是 Task 类型

只要遵守以上这些约定,就可以轻松创建自己的中间件。

以下是一个 Step By Step 例子。

Step By Step 步骤

  1. 创建一个空 ASP.NET Core webapi 项目
  2. 定义一个用于中间件的实体类
public class CheckAndParsingMiddlewareModel
{
  public int i { get; set; }
  public int j { get; set; }
}

3.定义一个中间件类 CheckAndParsingMiddleware,留意注释

using System.Text.Json;
using System.Text;
/// <summary>
/// 自定义中间类,要求如注释的 1~5 点
/// </summary>
public class CheckAndParsingMiddleware
{
  private readonly RequestDelegate next;
  // 1. 需要有一个构造方法
  // 2. 构造方法需要有一个 RequestDelegate 类型的参数,用于指向下一个中间件
  public CheckAndParsingMiddleware(RequestDelegate next)
  {
    this.next = next;
  }
  // 3. 需要有一个名为 Invoke 或 InvokeAsync 的方法
  // 4. 此方法至少要有一个 HttpContext 类型参数
  // 5. 此方法的返回值必须是 Task 类型
  public async Task InvokeAsync(HttpContext context)
  {
    string pwd = context.Request.Query["password"];
    if (pwd == "123")
    {
      if (context.Request.HasJsonContentType())
      {
        // 解析 Body 参数的值
        var reqStream = context.Request.BodyReader.AsStream();
        var jsonObj = JsonSerializer.Deserialize<CheckAndParsingMiddlewareModel>(reqStream);
        // 将数据存在Items中
        // HttpContext.Items 在同一个请求中是共享的,可以用它在多个中间件之间来传递数据
        context.Items["BodyJson"] = jsonObj; 
      }
      // 把请求转给下一个中间件
      await next(context); 
    }
    else
    {
      context.Response.StatusCode = 401;
    }
  }
}

4.打开 Program.cs,编写使用自定义的中间件的代码,如:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/testForCustomMiddleware", async appbuild => { 
  // 使用自定义的中间件
  appbuild.UseMiddleware<CheckAndParsingMiddleware>();
  
  // 执行
  appbuild.Run(async ctx => {
    ctx.Response.ContentType = "text/html";
    ctx.Response.StatusCode = 200;
    var jsonObj = (CheckAndParsingMiddlewareModel)ctx.Items["BodyJson"];
    int i = jsonObj.i;
    int j = jsonObj.j;
    await ctx.Response.WriteAsync($"{i}+{j}={i+j}");
  });
});
app.Run();

5.其它:解析 Body 参数值的方法

// 方法 1
var reqStream = context.Request.BodyReader.AsStream();
var jsonObj = JsonSerializer.Deserialize<CheckAndParsingMiddlewareModel>(reqStream);
// 方法 2
Stream reqStream = context.Request.Body;
byte[] buffer = new byte[context.Request.ContentLength!.Value];
await reqStream.ReadAsync(buffer, 0, buffer.Length);
var reqStr = Encoding.UTF8.GetString(buffer);
dynamic jsonObj = JsonSerializer.Deserialize<dynamic>(reqStr)!;

扩展

中间件类的构造方法和 Invoke(或 InvokeAsync)方法还可以定义其他参数,其他参数会通过依赖注入自动赋值。


相关文章
|
11月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
767 6
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
917 5
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
545 1
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
597 3
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
1032 0
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
890 5
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
533 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
435 0
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
470 0
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
604 0