[ASP.NET Core學習筆記]03-中介層(Middleware)
在ASP.NET Core中,使用中介層(Middleware),來組成Request Pipeline,每一個中介層可以決定
- 決定是否要傳送要求到下一個中介層
- 可以在呼叫下一個中介層的之前或之後,執行工作
下圖為Middleware概念圖
使用IApplicationBuilder來建立Middleware
ASP.NET Core可以透過 Run
Use
Map
等擴充方法來建立自己的Middleware
而第一個Run
會終止Request pipeline,Use
可以把多個Middleware串連在一起,Map
為可以對應Route設定而執行不同的Request pipeline,接下來我們就來嘗試一下這三種的區別。
app.Run:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//app.Run 會終止所有Request Pipeline 下面的Middle01不會執行
app.Run(async context => { await context.Response.WriteAsync("Hello world"); });
app.Use(
async (context, next) =>
{
Console.WriteLine("BeforeMiddleware01");
await next.Invoke();
Console.WriteLine("AfterMiddleware01");
});
}
app.Use
//app.Use 會將要求傳至下一個Middleware
//以下設定呼叫的順序會是 BeforeMiddleware01 -> BeforeMiddleware02 -> AfterMiddleware02 -> AfterMiddleware01
app.Use(
async (context, next) =>
{
Console.WriteLine("BeforeMiddleware01");
await next.Invoke();
Console.WriteLine("AfterMiddleware01");
});
app.Use(
async (context, next) =>
{
Console.WriteLine("BeforeMiddleware02");
await next.Invoke();
Console.WriteLine("AfterMiddleware02");
});
實際執行結果
app.Map
//app.Map 是app.Run的擴充,可以根據route路徑來套用app.Run的MiddleWare
app.Map("/map1",
config =>
{
config.Run(async (context) =>
{
await context.Response.WriteAsync("Map Test 1");
});
});
app.Map("/map2",
config =>
{
config.Run(async (context) =>
{
await context.Response.WriteAsync("Map Test 2");
});
});
實際執行結果
順序
Startup.Configure
方法中的MiddleWare可以定義叫用與回應的順序,對於效能、安全、功能性來說,這些順序很重要
- 例外狀況/錯誤處理
- HTTPS 重新導向 (UseHttpsRedirection)
- 靜態檔案 (UseStaticFiles)
- Cookie 原則 (UseCookiePolicy)
- 驗證 (UseAuthentication)
- 工作階段 (UseSession)
- MVC (UseMvc)
ASP.NET Core 有內建提供一些MiddleWare可供使用
請參考官方說明文件