.net 6.0自定义中间件

作者 : 慕源网 本文共2679个字,预计阅读时间需要7分钟 发布时间: 2022-11-8 共136人阅读

现在我们将编写一个.net 6.0自定义中间件,自定义中间件将在单独的类中编写,以便我们可以避免在 Program.cs 文件中使用内联中间件。

中间件类必须包括以下内容:

  1. 参数类型为RequestDelegate 的公共构造函数。
  2. 名为Invoke或InvokeAsync 的公共方法。方法返回Task。
  3. 第一个参数的类型应为HttpContext
  4. 通过IApplicationBuilder 创建了一个扩展方法。
  5. 构造函数和调用/调用异步的其他参数可以通过依赖关系注入进行填充。

让我们使用Visual Studio并创建一个中间件。我将在本教程中使用以下工具:

  • Visual Studio Community Edition 2022 (64-bit) – Preview (Version 17.3.0 Preview 4.0)
  • .NET 6.0
  • Minimal Web API
  • Swagger

创建自定义中间件有三种方法。

方法1

  1. 右键单击项目->加载项>新项
  2. 在弹出窗口中搜索中间件
  3. 选择中间件类,提供一个有意义的名称,然后单击“添加”

将使用默认实现创建一个类,如下所示:

namespace MiddlewareTutorial {
    // You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
    public class LoggingMiddleware {
        private readonly RequestDelegate _next;
        public LoggingMiddleware(RequestDelegate next) {
            _next = next;
        }
        public Task Invoke(HttpContext httpContext) {
            return _next(httpContext);
        }
    }
    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class LoggingMiddlewareExtensions {
        public static IApplicationBuilder UseLoggingMiddleware(this IApplicationBuilder builder) {
            return builder.UseMiddleware < LoggingMiddleware > ();
        }
    }
}

方法2

  1. 添加新类。
  2. 添加 RequestDelegate 类型参数的公共构造函数。
  3. 添加一个名为 Invoke/InvokeAsync 的方法,其中 HttpContext 作为第一个参数,返回类型Task。
  4. 通过 IApplicationBuilder 添加用于公开中间件的扩展方法。

如下所示:

namespace MiddlewareTutorial {
    public class ClassWithNoImplementationMiddleware {
        private readonly RequestDelegate _next;
        public ClassWithNoImplementationMiddleware(RequestDelegate next) {
            _next = next;
        }
        public async Task InvokeAsync(HttpContext httpContext) {
            await httpContext.Response.WriteAsync("Hello Readers!, this from Customer Middleware...");
        }
    }
    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class ClassWithNoImplementationMiddlewareExtensions {
        public static IApplicationBuilder UseClassWithNoImplementationMiddleware(this IApplicationBuilder builder) {
            return builder.UseMiddleware < ClassWithNoImplementationMiddleware > ();
        }
    }
}

方法3

  1. 创建类
  2. 实现接口 IMiddleware

该类将如下所示:

namespace MiddlewareTutorial {
    public class ClassWithIMiddlewareInterface: IMiddleware {
        public Task InvokeAsync(HttpContext context, RequestDelegate next) {
            throw new NotImplementedException();
        }
    }
}

让我们快速检查一个简单的自定义中间件示例以及如何在 Program.cs 中使用它。我将使用方法 2 中的示例代码。

public async Task InvokeAsync(HttpContext httpContext) {
    await httpContext.Response.WriteAsync("Hello Readers, this is from Custom Middleware...");
}

现在让我们在 Program.cs 类中使用此中间件。

using MiddlewareTutorial;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) {
    app.UseClassWithNoImplementationMiddleware();
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.Run();

输出将如下所示:

感谢您阅读这篇文章。我希望您已经了解.net 6.0自定义中间件。请在下面的评论框中留下您的反馈。


慕源网 » .net 6.0自定义中间件

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录