ASP.NET?Core中創(chuàng)建中間件的方式匯總
前言
今天我們一起來盤點一下在ASP.NET Core應用程序中添加和創(chuàng)建中間件常見的四種方式。
中間件介紹
ASP.NET Core中間件(Middleware)是用于處理HTTP請求和響應的組件,它們被安排在請求處理管道中,并按順序執(zhí)行。中間件的設計是為了使其在請求處理管道中能夠以靈活和可擴展的方式處理 HTTP 請求和響應。
下圖顯示了 ASP.NET Core MVC 和 Razor Pages 應用的完整請求處理管道:
了解現(xiàn)有中間件的順序,以及在哪里添加自定義中間件。你可以完全控制如何重新排列現(xiàn)有中間件,或根據(jù)場景需要注入新的自定義中間件。
中間件用途
開發(fā)者通過在請求處理管道中添加不同的中間件(Middleware)組件,可以實現(xiàn)應用程序的認證和授權、日志記錄、異常處理、靜態(tài)文件處理、路由和端點映射、CORS(跨域資源共享)、會話管理、請求壓縮、國際化和本地化、緩存等各種功能。
通過請求委托添加中間件
我們可以通過在 WebApplication 實例上調用 Use 方法,并提供一個帶有兩個參數(shù)的 lambda 方法來實現(xiàn)。第一個參數(shù)是 HttpContext,第二個參數(shù)是管道中的實際下一個請求委托。
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Use(async (context, next) => { // 在這里處理請求 // ... await next.Invoke(); // 在這里處理響應 // ... }); app.Run();
按約定添加中間件
ASP.NET Core中提供了許多內置中間件,例如靜態(tài)文件中間件、路由、認證、授權中間件等。這些中間件通常已經(jīng)預先定義好了,開發(fā)者只需按照約定調用相應的方法即可。
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 使用靜態(tài)文件中間件 app.UseStaticFiles(); // 使用路由中間件 app.UseRouting(); // 使用認證中間件 app.UseAuthentication(); // 使用授權中間件 app.UseAuthorization(); app.Run();
創(chuàng)建自定義中間件類
創(chuàng)建自定義中間件類
首先我們創(chuàng)建一個自定義中間件類 RequestLoggingMiddleware
,它將記錄每個請求的詳細信息。
public class RequestLoggingMiddleware { private readonly RequestDelegate _next; public RequestLoggingMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 記錄請求信息 Console.WriteLine($"Request Method: {context.Request.Method}"); Console.WriteLine($"Request Path: {context.Request.Path}"); // 調用下一個中間件 await _next(context); // 記錄響應狀態(tài)碼 Console.WriteLine($"Response Status Code: {context.Response.StatusCode}"); } }
創(chuàng)建擴展方法
為了方便在應用程序中注冊中間件,我們可以創(chuàng)建一個擴展方法。
public static class RequestLoggingMiddlewareExtensions { public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder) { return builder.UseMiddleware<RequestLoggingMiddleware>(); } }
在應用程序中使用自定義中間件
在 Program.cs
文件中,使用自定義中間件。
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 使用自定義中間件 app.UseRequestLogging(); app.Run();
添加基于工廠的中間件
IMiddlewareFactory 是 ASP.NET Core 中用于創(chuàng)建和管理中間件實例的接口。它提供了一種靈活的方式來控制中間件的創(chuàng)建和生命周期管理,特別是在需要復雜依賴注入或條件實例化的場景中。
創(chuàng)建自定義中間件工廠
實現(xiàn) IMiddlewareFactory 接口的自定義工廠類。
public class CustomMiddlewareFactory(IServiceProvider serviceProvider) : IMiddlewareFactory { private readonly IServiceProvider _serviceProvider = serviceProvider; public IMiddleware? Create(Type middlewareType) { // 使用服務提供者創(chuàng)建中間件實例 return _serviceProvider.GetService(middlewareType) as IMiddleware; } public void Release(IMiddleware middleware) { // 如果需要,可以在這里釋放中間件實例(容器負責釋放資源) (middleware as IDisposable)?.Dispose(); } }
創(chuàng)建自定義中間件
實現(xiàn) IMiddleware 接口的自定義中間件類。
public class CustomMiddleware : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { Console.WriteLine("在這里處理請求......."); await next(context); Console.WriteLine("在這里處理響應......."); } }
注冊中間件和工廠
在 Program.cs
文件中注冊自定義中間件和工廠。
var builder = WebApplication.CreateBuilder(args); // 注冊中間件和工廠到依賴注入容器 builder.Services.AddTransient<CustomMiddleware>(); builder.Services.AddTransient<IMiddlewareFactory, CustomMiddlewareFactory>(); var app = builder.Build(); // 使用基于工廠的中間件 app.UseMiddleware<CustomMiddleware>(); app.Run();
最后總結
在ASP.NET Core中添加和創(chuàng)建中間件的方式有很多種,本文列舉了四種常見的方式,具體取決于你的需求和偏好。每種方式都有其適用的場景,選擇合適的方法可以使你的代碼更加簡潔和易于維護。
參考文章
- https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-8.0
- https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/extensibility?view=aspnetcore-8.0
DotNetGuide技術社區(qū)交流群
- DotNetGuide技術社區(qū)是一個面向.NET開發(fā)者的開源技術社區(qū),旨在為開發(fā)者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和咨詢、項目框架推薦、求職和招聘資訊、以及解決問題的平臺。
- 在DotNetGuide技術社區(qū)中,開發(fā)者們可以分享自己的技術文章、項目經(jīng)驗、學習心得、遇到的疑難技術問題以及解決方案,并且還有機會結識志同道合的開發(fā)者。
- 我們致力于構建一個積極向上、和諧友善的.NET技術交流平臺。無論您是初學者還是有豐富經(jīng)驗的開發(fā)者,我們都希望能為您提供更多的價值和成長機會。
到此這篇關于ASP.NET Core中創(chuàng)建中間件的幾種方式的文章就介紹到這了,更多相關ASP.NET Core中創(chuàng)建中間件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Windows下Visual Studio 2017安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了Windows下Visual Studio 2017安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06利用Typings為Visual Studio Code實現(xiàn)智能提示功能
最近在學習Node.js及ThinkJS這個框架,用vscode作為開發(fā)環(huán)境。默認情況下vscode對ThinkJS的代碼提示并不好,所以研究了一下,原來可以同通過Typings來讓vscode擁有強大的智能代碼提示功能。下面本文就介紹了如何利用Typings為Visual Studio Code實現(xiàn)智能提示功能。2017-02-02.NET醫(yī)院公眾號系統(tǒng)線程CPU雙高問題分析
這篇文章主要介紹了.NET醫(yī)院公眾號系統(tǒng) 線程CPU雙高分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04ASP.NET?Core?實現(xiàn)自動刷新JWT?Token
這篇文章主要介紹了ASP.NET?Core?實現(xiàn)自動刷新JWT?Token,通過增加??refresh_token??,客戶端使用refresh_token去主動刷新JWT?Token,下文具體操作過程需要的小伙伴可以參考一下2022-04-04基于?.NET?6?的ASP.NET?Core啟動地址配置方法及優(yōu)先級順序
這篇文章主要介紹了ASP.NET?Core啟動地址配置方法及優(yōu)先級順序,?.NET?6?使用了最小?WEB?API,?配置方式已經(jīng)部分發(fā)生了變化,下面文章我們來看看具體的方法,需要的小伙伴可以參考一下2022-03-03Remoting和Webservice的詳細介紹及區(qū)別
這篇文章主要介紹了Remoting和Webservice的詳細介紹及區(qū)別的相關資料,需要的朋友可以參考下2016-11-11