ASP.NET Core引入了中間件(middleware)的概念來定義HTTP 管道(pipeline)。中間件是一系列組合在一起形成web應(yīng)用程序的組件。這個概念的靈感來源于OWIN和Katana,在ASP.NET早期版本中也提供了類似的功能。
一個中間件是HTTP 管道中的一個組件。中間件逐個執(zhí)行,并在管道中鏈?zhǔn)降卣{(diào)用下一個中間件。每個中間件都可以終止調(diào)用鏈。例如,如果認(rèn)證過程失敗,則認(rèn)證中間件不會再執(zhí)行下一個中間件。下圖說明了執(zhí)行流程。
除了ASP.NET Core中內(nèi)置的中間件,我們也可以創(chuàng)建新的中間件。如果需要自定義中間件,可以編寫一個類,該類中必須包含以HttpContext作為第一個參數(shù)的方法。這個方法允許增加其他參數(shù),可以通過依賴注入進行解析。下面的類定義了一個日志中間件:
public class RequestLoggerMiddleware{ private readonly RequestDelegate _next; private readonly ILogger _logger; public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory) { _next = next; _logger = loggerFactory.CreateLogger(); } public async Task Invoke(HttpContext context) { _logger.LogInformation("Handling request: " + context.Request.Path); await _next.Invoke(context); _logger.LogInformation("Finished handling request."); }}中間件必須在Startup類的Configure方法中進行注冊才可以執(zhí)行。
public void Configure(IApplicationBuilder app) { app.UseMiddleware(); }一點需要注意的是,中間件的執(zhí)行順序依賴于它們添加到管道中的順序。這就意味著必須花費一些精力確定中間件之間隱含的依賴關(guān)系。例如,一個組件要使用會話狀態(tài),但是如果它在會話中間件之前執(zhí)行,則會導(dǎo)致崩潰。
伴隨著ASP.NET Core“為你所用的資源付費”的理念,一些應(yīng)用程序的性能可能會有所改善,因為只有明確配置的中間件才會執(zhí)行。該框架不再依賴于System.Web.dll;組件將以NuGet包的形式提供。這也意味著組件的更新將由NuGet負(fù)責(zé)處理,并且每個中間件均可獨立更新。