如何在 ASP.NET Core 中 自定义中间件
ASP.NET Core 是一個跨平臺,開源的,輕量級,高性能 并且高度模塊化的web框架,同時擴展性也是非常強,你可以在 request -> response 請求管道中安插各種中間件來根據自己的場景定制化,比如說:監視,路由,修改 request 或 response 消息體,這篇文章我們就來討論 ASP.NET Core 中間件以及如何使用。
ASP.NET Core 中存在一條 中間件 鏈條,這條鏈是由一組 委托方法 組成,這些委托方法會一個接一個的被執行,request 請求會從這些中間件鏈條中流轉,被流轉到的組件,要么處理這個請求,要么將請求傳給下一個中間件。
配置 中間件管道
中間件的管道配置是在 Startup.Configure 方法中 ,準確的說這里就是組裝你的 ASP.Net Core 請求管道,ASP.Net運行時會自動調用這個 Configure 方法,代碼如下:
public?void?Configure(IApplicationBuilder?app,?IHostingEnvironment?env,?ILoggerFactory?loggerFactory,?IdentityDbContext?dbContext){app.UseDeveloperExceptionPage();???????????app.UseStaticFiles();??????????app.UseMvcWithDefaultRoute();}上面的代碼展示了如何將 mvc 添加到 ASP.Net Core 的 請求處理管道 中,接下來準備實現自定義中間件。
創建自定義中間件
可以利用 IApplicationBuilder 接口的擴展方法來構建你的中間件,為了代碼可維護性,建議將自定義的中間件邏輯單獨放在一個類中,或者一個單獨的項目中,這樣你在更新這些代碼的時候不需要更新業務邏輯層的代碼。
有多種方法可以構建自定義中間件,我準備來演示那最簡單的一種,首先創建一個名為 MyCustomMiddleware 的cs類,骨架代碼大概是這樣:
public?class?MyCustomMiddleware{//This?is?our?custom?middleware}接下來在類的構造函數中新增一個 RequestDelegate 參數,這個 RequestDelegate 委托的簽名是接收 HttpContext 參數 并返回 Task,下面是修改后的 MyCustomMiddleware。
public?class?MyCustomMiddleware{private?readonly?RequestDelegate?_next;public?MyCustomMiddleware(RequestDelegate?next){_next?=?next;}}執行 自定義中間件
現在需要給 MyCustomMiddleware 提供一個可執行的方法,供 處理流 執行到這個類時執行此方法,就是下面的 Invoke ,有些朋友可能要問了,為啥一定是 Invoke 方法,可以是其他的嗎?不可以的,這是 ASP.Net Core 中間件中約定的方法名, Invoke 方法中你可以實現監視或者修改 Request 或 Resposne。
public?class?MyCustomMiddleware{private?readonly?RequestDelegate?_next;public?MyCustomMiddleware(RequestDelegate?next){_next?=?next;}public?async?Task?Invoke(HttpContext?httpContext){if?(!httpContext.Request.Headers.Keys.Contains("Authentication-Key")){httpContext.Response.StatusCode?=?400;await?httpContext.Response.WriteAsync("Authentication?key?is?missing...");return;}else{//Write?code?here?to?validate?the?authentication?key.}await?_next.Invoke(httpContext);}}參考上面的代碼,中間件的作用就是判斷 request header 中有沒有有效的 authentication key,如果沒有就會返回具體的錯誤信息給客戶端。
創建擴展方法
接下來為剛才創建的 自定義中間件 創建一個擴展方法,這么做的目的就是可以方便將 中間件 注入到 pipeline 中,官方的推薦做法就是在 IApplicationBuilder 接口上進行擴展,下面的代碼展示了如何去實現。
public?static?class?MyCustomMiddlewareExtensions{public?static?IApplicationBuilder?UseMyCustomMiddleware(this?IApplicationBuilder?builder){return?builder.UseMiddleware<MyCustomMiddleware>();}}最后要做的就是在 Configure 方法下進行配置,在 app 參數下使用 UseMyCustomMiddleware() 即可,如下代碼所示:
public?void?Configure(IApplicationBuilder?app,?IHostingEnvironment?env){app.UseMyCustomMiddleware();}最后將程序跑起來,如下圖:
從上面輸出中可以看到,我的自定義中間件起作用了,可以看出中間件的做法讓 web程序 擴展性大大提高,如果你想了解更多中間件的知識,可參考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?tabs=aspnetcore2x&view=aspnetcore-5.0
譯文鏈接:https://www.infoworld.com/article/3247624/how-to-build-custom-middleware-in-aspnet-core.html
總結
以上是生活随笔為你收集整理的如何在 ASP.NET Core 中 自定义中间件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 临近年关,发生两起磁盘占满引发的服务下线
- 下一篇: ASP.NET Core Authent