中间件是什么
想知道如何自定义中间件,最起码要先了解一下ASP.NET Core的中间件是什么,根据微软官方的解释,中间件是用于处理请求和响应。在以前使用ASP.NET开发的时代,对于处理请求和响应我们都是使用HttpModule和HttpHandler来处理的,但在ASP.NET Core中都替换成了中间件,因为ASP.NET Core是基于一系列中间件构建的。
中间件执行流程
从上图我们可以看出中间件是一个接着一个被调用的,然后响应时以相反的顺序返回,每个中间件都可以选择是否传递到下一个中间件,从而自己处理该请求,也称为管道短路,这种方式可以避免不必要的处理。
如何使用中间件
ASP.NET Core内置了很多中间件,那么如何使用呢?在ASP.NET Core中有提供三种方法来使用中间件,分别是Run、Map与Use方法。
Run:会短路管道,不会执行下面中间件,一般只放在管道底部使用。
app.Run(async (context) =>{ await context.Response.WriteAsync(“Run方法”) });
Map:基于给定请求路径的匹配项来创建请求管道分支。
private static void HandleMapTest1(IApplicationBuilder app)
{
app.Map("/map1", HandleMapTest1);
}
Use:可以将多个管道链接在一起,可通过不调用下一个中间件使管道短路。
app.Use(async (context, next) =>{ await next.Invoke(); });
如何自定义中间件
虽然ASP.NET Core内置了很多中间件,但可能有时候无法满足需求,这时候就需要自定义中间件了,下面是自定义中间件步骤和示例代码。
(1) 在ASP.NET Core Web应用程序中新建一个类
public class RequestUserCheckMiddleware
{
private readonly RequestDelegate _next;
public RequestUserCheckMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
string userName = context.Request.Query["UserName"];
if(!string.IsNullOrEmpty(userName)&&userName.ToLower().Contains("admin"))
{
await context.Response.WriteAsync("用户名:" + userName);
await _next(context);
}
else
{
await context.Response.WriteAsync("非法用户");
}
}
}
(2) 定义扩展方法公开中间件
public static class RequestUserCheckExtensions
{
public static IApplicationBuilder UseRequestUserCheck(this IApplicationBuilder builder) {
return builder.UseMiddleware<RequestUserCheckMiddleware>();
}
}
(3)使用自定义的中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRequestUserCheck();//用户检查
app.Run(async (context) =>
{
await context.Response.WriteAsync($"Hello {CultureInfo.CurrentCulture.DisplayName}");
});
}
相信你看完这篇文章已知道如何自定义中间件了吧,中间件是外层请求最先处理地方,可以提前做过滤工作,但不适合写业务逻辑。