在ASP.NET Core中編寫合格的中間件

  這篇文章探討了讓不一樣的請求去使用不一樣的中間件,那麼咱們應該如何配置ASP.NET Core中間件?其實中間件只是在ASP.NET Core中處理Web請求的管道。全部ASP.NET Core應用程序至少須要一箇中間件來響應請求,而且您的應用程序實際上只是中間件的集合。固然MVC管道自己就是中間件,早在WebForm時代就出現過HttpModules、HttpHandler、那個時候悠然記得我經過它們來組織個人廣告系統,不閒扯咱們繼續。html

  每一箇中間件組件都有一個帶有HttpContext參數的Invoke方法。您可使用這個參數來處理方法。api

public async Task Invoke(HttpContext context) { if (context.Request.Path...) { await context.Response.WriteAsync("writing text..."); } }

   應用程序中最頂層的中間件將始終針對每一個請求被調用。這是由.NET框架自動完成的。中間件能夠向客戶端發送響應,也能夠調用下一個中間件。對於後一種選擇,它固然須要訪問下一個中間件組件。這就是爲何大多數中間件組件都是使用帶有RequestDelegate參數的構造函數定義的。總之,RequestDelegate會自動填充,您無需在乎。app

   中間件在Startup.cs的Configure方法中註冊。Configure方法具備IApplicationBuilder參數,該參數提供了全部類型的中間件註冊所需的方法,咱們試着去編寫一箇中間件。框架

public class MyCustomMiddleware { private readonly RequestDelegate _next; public MyCustomMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context, IWebHostEnvironment env) { context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet"; context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet"; await _next(context); } }

隨後咱們在Startup.cs的Configure方法中經過 use 來註冊自定義中間件。async

public void Configure(IApplicationBuilder app, ...) { app.UseMyCustomMiddleware(); }

  啓動程序咱們發現一些正常,咱們獲得了咱們想要的效果。函數

 

  但實際上,您不多須要直接調用UseMiddleware,由於中間件做者的標準方法是編寫特定於所註冊中間件的擴展方法:ui

using MiddlerWareSolucation.MiddlerWare;
using Microsoft.AspNetCore.Builder;
namespace MiddlerWareSolucation.MiddlerWare_Extensions { public static class MyCustomMiddlewareExtensions { public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app) { app.UseMiddleware<MyCustomMiddleware>(); return app; } } }

隨後直接調用Extensions擴展方法,效果仍是同樣的。this

public void Configure(IApplicationBuilder app, ...) { app.UseMyCustomMiddleware(); }

 部分時候咱們想要經過客戶端請求的路徑來對咱們的中間件進行啓動,固然 MapWhen 容許您經過指定謂詞將中間件管道分紅兩個徹底獨立的分支:spa

app.UseMiddlewareOne(); app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { appBuilder.UseMiddlewareTwo(); }); app.UseMiddlewareThree();

在此示例中,中間件One將始終執行,若是請求路徑以「 / api」開頭,則將執行中間件Two。不然,將執行中間件Three。使用這種配置,中間件2和中間件3都沒法針對單個請求執行。code

我想說的是最後一種狀況是,您但願大多數中間件針對全部請求運行,可是您有一些條件件-特定中間件僅應針對某些請求運行。

這能夠經過UseWhen輕鬆實現,UseWhen還使用謂詞來肯定中間件是否應該運行:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}"); appBuilder.UseExceptionHandler("/apierror/500"); });

這樣就能夠經過選擇註冊方式來本身控制中間件。

原文出處:https://www.cnblogs.com/ZaraNet/p/11799534.html

相關文章
相關標籤/搜索