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}");             
});    
}

相信你看完這篇文章已知道如何自定義中間件了吧,中間件是外層請求最先處理地方,可以提前做過濾工作,但不適合寫業務邏輯。

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