聊聊 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)方法还可以定义其他参数,其他参数会通过依赖注入自动赋值。


相关文章
|
5天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
23 5
|
24天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
35 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
13天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
22 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
开发框架 .NET 中间件
ASP.NET Core 面试题(二)
ASP.NET Core 面试题(二)
330 0
|
开发框架 JSON .NET
ASP.NET Core 面试题(一)
ASP.NET Core 面试题(一)
983 0
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
46 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
74 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
55 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?

相关实验场景

更多