官方文件
Middleware組成的Pipeline處理所有的Request及Response(取代Http Moudles以及HTTP Handlers)
Middleware一個接一個,每個Middleware都可以選擇是否將Request傳遞給下一個Middleware,並在下一個Middleware前後執行工作。
Middleware執行順序:
可以自訂程式碼來定義 Middleware 也可以利用next
的呼叫決定是否要進入下個Middleware
if (app.Environment.IsDevelopment())
{
app.Use(async (context, next) => {
await context.Response.WriteAsync($"11111{Environment.NewLine}");
await next();
await context.Response.WriteAsync($"22222{Environment.NewLine}");
});
app.Run(async context => {
await context.Response.WriteAsync($"33333{Environment.NewLine}");
});
}
結果如下
Run
為最末端的行為,也無法像Use
使用next
串聯Middleware,通常被稱為終端委託
,執行完第一個會直接結束Middleware。
if (app.Environment.IsDevelopment())
{
app.Run(async context => {
await context.Response.WriteAsync($"111111{Environment.NewLine}");
});
app.Run(async context => {
await context.Response.WriteAsync($"22222{Environment.NewLine}");
});
}
結果如下
Map
用於分支Pipeline,Map 會依據指定相符的請求路徑請求Pipeline。如果請求路徑以給定路徑開始,則執行分支。
app.Map("/111111", One);
app.Map("/222222", Two);
app.Run();
static void One(IApplicationBuilder app)
{
app.Run(async context => {
await context.Response.WriteAsync($"You are 111111{Environment.NewLine}");
});
}
static void Two(IApplicationBuilder app)
{
app.Run(async context => {
await context.Response.WriteAsync($"You are 222222{Environment.NewLine}");
});
}
結果如下
https://localhost:7056/111111
https://localhost:7056/222222
那今天就到這邊囉,大家明天見!