問題
如何建立一個最簡單的ASP.NET Core中介軟體?
答案
使用VS建立一個ASP.NET Core 2.0的空專案,注意Startup.cs中的Configure()方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.Run(async (context) => { await context.Response.WriteAsync("Hello World! (Run)"); }); }
比較好的建立請求管道的方法是使用IApplicationBuilder上的擴充套件方法:
public static void RunHelloWorld(this IApplicationBuilder app) { app.Run(async (context) => { await context.Response.WriteAsync("Hello World! (Run)"); }); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.RunHelloWorld(); }
執行,此時頁面顯示:
上面我們使用IApplicationBuilder.Run()來配置中介軟體,另外一種方法是IApplicationBuilder.Use():
public static void UseHelloWorld(this IApplicationBuilder app) { app.Use(async (context, next) => { await context.Response.WriteAsync("Hello World! (Use)\n"); await next(); }); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHelloWorld(); app.RunHelloWorld(); }
執行,此時頁面顯示:
將中介軟體作為單獨的類定義是更好的實踐方法:
public class HelloWorldMiddleware { private readonly RequestDelegate _next; public HelloWorldMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { await context.Response.WriteAsync("Hello World! (Use in Class)\n"); await _next(context); } } public static class UseHelloWorldInClassExtensions { public static IApplicationBuilder UseHelloWorldInClass(this IApplicationBuilder app) { return app.UseMiddleware<HelloWorldMiddleware>(); } }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHelloWorld(); app.UseHelloWorldInClass(); app.RunHelloWorld(); }
執行,此時頁面顯示:
討論
中介軟體是一個攔截HTTP請求和響應訊息的元件。我們透過建立這些元件鏈,來為我們的應用程式建立一個請求管道。
我們透過Configure()方法的IApplicationBuilder引數來建立這個請求管道,IApplicationBuilder引數有如下方法:
- Run():新增中介軟體並終止請求管道(也就是說不再呼叫下一個中介軟體)。
- Use():新增中介軟體,使用lambda表示式或者一個具體的類。
- Map():根據請求路徑新增中介軟體。
Run
這個方法接受RequestDelegate委託作為引數,當委託方法被呼叫時接受HttpContext引數。這個委託方法返回void,因為它會終止請求管道。
Use
這個方法接受Func委託作為引數,此委託方法有兩個引數,分別是HttpContext和指向下一個中介軟體的next,返回空(Task)。如果沒有呼叫下一個中介軟體,就會終止請求管道(和Run效果一樣)。
UserMiddleware
當透過單獨類建立中介軟體時,我們使用UseMiddleware方法,並將具體的實現型別作為泛型引數。
在中介軟體類中,有兩個部分很重要:
1. 建構函式接受RequestDelegate。當呼叫此委託時會將當前請求傳入下一個中介軟體。
2. 它擁有一個Invoke方法,接收HttpContext引數並返回空(Task)。當需要用到中介軟體時,框架會主動呼叫這個方法。
注:在單獨類中實現中介軟體,並用UseMiddleware封裝起來是最佳實踐。
擴充套件方法
需要注意擴充套件方法的不同之處,RunXXX不會返回值,而UseXXX會返回值(IApplicationBuilder)。這是因為Run()終止請求管道,而Use()可能會連結到其他的中介軟體。
順序
中介軟體按照它們在Configure()方法出現的順序依次被呼叫。而返回到客戶端的響應也會經歷相同的中介軟體管道。
原始碼下載
原文:https://tahirnaushad.com/2017/08/14/asp-net-core-middleware/