這期內容當中小編將會給大家帶來有關如何使用ASP.NETCore的中間件,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名申請、網絡空間、營銷軟件、網站建設、裕安網站維護、網站推廣。前言
我們知道,任何的一個web框架都是把http請求封裝成一個管道,每一次的請求都是經過管道的一系列操作,最終到達我們寫的代碼中。那么中間件就是在應用程序管道中的一個組件,用來攔截請求過程進行一些其他處理和響應。中間件可以有很多個,每一個中間件都可以對管道中的請求進行攔截,它可以決定是否將請求轉移給下一個中間件。
asp.net core 提供了IApplicationBuilder接口來讓把中間件注冊到asp.net的管道請求當中去,中間件是一個典型的AOP應用。
每一個中間件都都可以在請求之前和之后進行操作。請求處理完成之后傳遞給下一個請求。
中間件的運行方式
默認情況下,中間件的執行順序根據Startup.cs
文件中,在public void Configure(IApplicationBuilder app){}
方法中注冊的先后順序執行。
大概有3種方式可以在管道中注冊"中間件"
1.app.Use()
,IApplicationBuilder
接口原生提供,注冊等都用它。
2.app.Run()
,是一個擴展方法,它需要一個RequestDelegate
委托,里面包含了Http的上下文信息,沒有next參數,因為它總是在管道最后一步執行。
3.app.Map()
,也是一個擴展方法,類似于MVC的路由,用途一般是一些特殊請求路徑的處理。如:www.example.com/token 等。
上面的Run,Map內部也是調用的Use,算是對IApplicationBuilder接口擴充,如果你覺得名字都不夠準確,那么下面這個擴展方法就是正宗的注冊中間件的了,也是功能最強大的。
app.UseMiddleware<>()
,沒錯,就是這個了。 為什么說功能強大呢?是因為它不但提供了注冊中間件的功能,還提供了依賴注入(DI)的功能,以后大部分情況就用它了。
中間件(Middleware)和過濾器(Filter)的區別
熟悉MVC框架的同學應該知道,MVC也提供了5大過濾器供我們用來處理請求前后需要執行的代碼。分別是AuthenticationFilter
,AuthorizationFilter
,ActionFilter
,ExceptionFilter
,ResultFilter
。
根據描述,可以看出中間件和過濾器的功能類似,那么他們有什么區別?為什么又要搞一個中間件呢?
其實,過濾器和中間件他們的關注點是不一樣的,也就是說職責不一樣,干的事情就不一樣。
舉個栗子,中間件像是埃辛諾斯戰刃,過濾器像是巨龍之怒,泰蕾茍薩的寄魂杖 ,你一個戰士拿著巨龍之怒,泰蕾茍薩的寄魂杖去戰場殺人,雖然都有傷害,但是你拿著法杖傷害低不說,還減屬性啊。
同作為兩個AOP利器,過濾器更貼合業務,它關注于應用程序本身,比如你看ActionFilter 和 ResultFilter,它都直接和你的Action,ActionResult交互了,是不是離你很近的感覺,那我有一些比如對我的輸出結果進行格式化啦,對我的請求的ViewModel進行數據驗證啦,肯定就是用Filter無疑了。它是MVC的一部分,它可以攔截到你Action上下文的一些信息,而中間件是沒有這個能力的。
什么情況我們需要中間件
那么,何時使用中間件呢?我的理解是在我們的應用程序當中和業務關系不大的一些需要在管道中做的事情可以使用,比如身份驗證,Session存儲,日志記錄等。其實我們的 asp.net core項目中本身已經包含了很多個中間件。
舉例,我們在新建一個 asp.net core應用程序的時候,默認生成的模板當中
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { app.UseDeveloperExceptionPage(); app.UseStaticFiles(); loggerFactory.AddConsole(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
懶得去下載源碼了,我們使用Reflector去查看源碼:
//擴展方法`app.UseDeveloperExceptionPage();` public static class DeveloperExceptionPageExtensions { // Methods public static IApplicationBuilder UseDeveloperExceptionPage(this IApplicationBuilder app) { if (app == null) { throw new ArgumentNullException("app"); } return UseMiddlewareExtensions.UseMiddleware<DeveloperExceptionPageMiddleware>(app, Array.Empty<object>()); } } //擴展方法`app.UseStaticFiles();` public static class StaticFileExtensions { // Methods public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app) { if (app == null) { throw new ArgumentNullException("app"); } return UseMiddlewareExtensions.UseMiddleware<StaticFileMiddleware>(app, Array.Empty<object>()); } }
可以看到 app.UseDeveloperExceptionPage()
,app.UseStaticFiles()
等等都是通過中間件實現的。
怎么樣自定義自己的中間件
背景:我們項目使用到中間件的情景是,需要和其他部門進行用戶(User)信息的共享。 以平臺和子系統舉例,我們正在開發一個子系統,其中用戶信息,登錄,注冊等功能是放在平臺上的,這是一個跨多語言的系統,平臺是Java語言開發,用戶在訪問子系統的一些頁面的時候需要驗證是否登錄,另外一些頁面是不需要驗證是否登錄的,所以需要一個身份驗證系統來代替Identity的功能。
幸運的是微軟已經給我們提供了一套身份驗證的中間件,在Microsoft.AspNetCore.Authentication
命名空間下,我們只需要拓展,添加自己的功能就行了 。具體怎么做呢?直接看代碼吧。
根據約定俗成,中間件類需要有一個Invoke方法,簽名是public async Task Invoke(HttpContext context){}
,下面是一個中間件的示例類:
public class RequestLoggerMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory) { _next = next; _logger = loggerFactory.CreateLogger<RequestLoggerMiddleware>(); } public async Task Invoke(HttpContext context) { _logger.LogInformation("Handling request: " + context.Request.Path); await _next.Invoke(context); _logger.LogInformation("Finished handling request."); } }
了解了上面的約定之后,我們就開始定義我們自己的中間件Class。
我們需要一個流程圖來理清邏輯思路,以便于寫代碼的時候思路更加的清晰。
平臺有一個要求就是,用戶在我們子系統退出之后,要調用平臺的一個接口通知他們,他們要做一些后續的業務。
OK,開始擼碼。
首先創建一個PlatformAuthoricationMiddleware
,它繼承于Microsoft.AspNetCore.Authentication
下的類AuthenticationMiddleware
,由于AuthenticationMiddleware
已經實現了Invoke功能,所以我們只需要重寫(override)它里面的一些方法就可以了。等等,我們好像還需要一些配置,比如流程圖中的ReturnUrl,平臺的Cookie的Key值,平臺驗證用戶合法性的接口地址等參數。
建立一個Options
類進行配置的設置,我們取名字為:PlatformAuthenticationOptions
,繼承AuthenticationOptions
,并且實現掉IOptions<T>
接口,這樣子就能在Startup中直接配置了。
我們只需要重寫AuthenticationMiddleware
中的CreateHandler
方法就行了,在Handler中可以實現掉我們中間件的功能。
然后創建一個處理的Handler類,取名為PlatformAuthenticationHandler
,繼承于AuthenticationHandler<TOptions>
用來處理請求中的調用。
至此,我們的核心需要的類已經建立完了,剩下的就是填充代碼。
1.在PlatformAuthenticationHandler
中重寫HandleAuthenticateAsync()
方法 , 進行主流程的控制。
2.在PlatformAuthenticationHandler
中重寫FinishResponseAsync()
方法,進行Session的存儲操作。
3.在PlatformAuthenticationHandler
中重寫HandleSignOutAsync()
方法,進行登出的控制,因為用戶登出之后我們要通知平臺做一些其他操作。
4.在PlatformAuthenticationHandler
中重寫HandleUnauthorizedAsync()
方法,進行未認證操作。
最后,我們需要一個擴展類來把我們的中間件以擴展方法注冊到管道當中去 。
public static class MiddlewareExtensions { public static IApplicationBuilder UsePlatformAuthentication(this IApplicationBuilder app) { if (app == null) { throw new ArgumentNullException(nameof(app)); } return app.UseMiddleware<PlatformAuthenticationMiddleware>(); } public static IApplicationBuilder UsePlatformAuthentication(this IApplicationBuilder app, CookieAuthenticationOptions options) { if (app == null) { throw new ArgumentNullException(nameof(app)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } return app.UseMiddleware<PlatformAuthenticationMiddleware>(Options.Create(options)); } }
在Startup
中就是app.UsePlatformAuthentication()
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); //注冊PlatformAuthentication中間件 app.UsePlatformAuthentication(new PlatformAuthenticationOptions() { UserSessionStore = new UserSessionStore(), }); app.UseMvc(); }
上述就是小編為大家分享的如何使用ASP.NETCore的中間件了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創新互聯行業資訊頻道。
本文題目:如何使用ASP.NETCore的中間件-創新互聯
網頁地址:http://vcdvsql.cn/article44/csiche.html
成都網站建設公司_創新互聯,為您提供微信公眾號、網站維護、服務器托管、營銷型網站建設、企業網站制作、網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯