ASP.NET Core如何自定义中间件

中间件是什么

想知道如何自定义中间件,最起码要先了解一下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}");             
});    
}

相信你看完这篇文章已知道如何自定义中间件了吧,中间件是外层请求最先处理地方,可以提前做过滤工作,但不适合写业务逻辑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章