闽公网安备 35020302035485号

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();
最终的执行结果是一样的。