Middleware เป็นคอมโพเนนต์ซอฟต์แวร์ที่ประกอบรวมกันเป็น Pipeline ของแอปพลิเคชันเพื่อจัดการ Request และ Response แต่ละคอมโพเนนต์จะเลือกว่าจะส่ง Request ต่อไปยังคอมโพเนนต์ถัดไปใน Pipeline หรือไม่ และสามารถทำงานบางอย่างก่อนและหลังจากที่คอมโพเนนต์ถัดไปถูกเรียกใน Pipeline
Map Extensions ใช้เป็นข้อตกลงสำหรับการแยกสาขา (Branching) ของ Pipeline
Map Extension Method
เมธอด Map ใช้สำหรับจับคู่ Request Delegates ตาม Path ของ Request Map เพียงรับ Path และฟังก์ชันที่กำหนดค่า Middleware Pipeline แยกต่างหาก
ตัวอย่างพื้นฐาน
private static void HandleMapTest(IApplicationBuilder app) {
app.Run(async context => {
await context.Response.WriteAsync("Map Test Successful");
});
}
public void ConfigureMapping(IApplicationBuilder app) {
app.Map("/maptest", HandleMapTest);
}
ในตัวอย่างข้างต้น คำขอใดๆ ที่มี Base Path เป็น /maptest จะถูกจัดการโดย Pipeline ที่กำหนดค่าในเมธอด HandleMapTest
MapWhen - Predicate-based Branching
นอกจาก Path-based Mapping แล้ว เมธอด MapWhen รองรับ Predicate-based Middleware Branching อนุญาตให้สร้าง Pipeline แยกได้อย่างยืดหยุ่น
Predicate ใดๆ ประเภท Func<HttpContext, bool> สามารถใช้เพื่อแมป Request ไปยังสาขาใหม่ของ Pipeline
private static void HandleBranch(IApplicationBuilder app) {
app.Run(async context => {
await context.Response.WriteAsync("Branch used.");
});
}
public void ConfigureMapWhen(IApplicationBuilder app) {
app.MapWhen(context => {
return context.Request.Query.ContainsKey("branch");
}, HandleBranch);
app.Run(async context => {
await context.Response.WriteAsync("Hello from main pipeline");
});
}
ในตัวอย่างนี้ หาก Query String มี key "branch" จะเข้าสู่ Branch Pipeline มิฉะนั้นจะไปที่ Main Pipeline
Nested Maps (Map ต่อยอด)
Maps สามารถซ้อนกันได้ (Nested)
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a"
// ...
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b"
// ...
});
});
MapWhen กับเงื่อนไขหลายเงื่อนไข
app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), apiApp => {
apiApp.UseAuthentication();
apiApp.UseAuthorization();
apiApp.Run(async context => {
await context.Response.WriteAsync("API Pipeline");
});
});
app.MapWhen(context => context.Request.Path.StartsWithSegments("/admin"), adminApp => {
adminApp.UseMiddleware();
adminApp.Run(async context => {
await context.Response.WriteAsync("Admin Pipeline");
});
});