namespace MiddlewareSample.Middlewares { public class HelloMiddleware { private readonly RequestDelegate _next; // 堆代码 duidaima.com // 注入相应的依赖,这里是下一个中间件的委托,如果有其他依赖项需要用到,也可以从构造函数注入 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() 方法进行注册的。在这个过程中,会通过反射等手段通过我们封装好的中间件类生成一个委托。
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 堆代码 duidaima.com app.UseDefaultFiles(); app.UseStaticFiles(); app.UseHello(); app.Run(async context => { await context.Response.WriteAsync("Hello last Middleware ! "); }); app.Run();
最终的执行结果是一样的。