Routing ใช้สำหรับแมปคำขอ (Request) ไปยัง Route Handler ต่างๆ Route จะถูกกำหนดค่าเมื่อแอปพลิเคชันเริ่มต้น และสามารถดึงค่าจาก URL เพื่อใช้ในการประมวลผลคำขอได้
พื้นฐานของ Routing
Routing ใช้ Routes (การ implement ของ IRouter) เพื่อ:
- แมปคำขอที่เข้ามาไปยัง Route Handler
- สร้าง URL ที่ใช้ใน Response
Routing เชื่อมต่อกับ Middleware Pipeline โดยคลาส RouterMiddleware ASP.NET MVC เพิ่ม Routing เข้าไปใน Middleware Pipeline ส่วนหนึ่งของการกำหนดค่าของมัน
URL Matching (การจับคู่ URL)
คำขอที่เข้ามาจะเข้าสู่ RouterMiddleware ซึ่งจะเรียกเมธอด RouteAsync บนแต่ละ Route ตามลำดับ อินสแตนซ์ IRouter จะเลือกว่าจะจัดการคำขอหรือไม่โดยการตั้งค่า RouteContext Handler ให้เป็น RequestDelegate ที่ไม่ใช่ null
ถ้ามีการตั้งค่า Handler สำหรับ Route จะถูกเรียกใช้เพื่อประมวลผลคำขอ และ Route ต่อไปจะไม่ถูกประมวลผล ถ้าทุก Route ถูก Execute แล้ว และไม่พบ Handler สำหรับคำขอ Middleware จะเรียก next และ Middleware ต่อไปใน Pipeline จะถูกเรียกใช้
URL Generation (การสร้าง URL)
การสร้าง URL ทำตามกระบวนการแบบ Iterative คล้ายกัน แต่เริ่มต้นจากโค้ดของผู้ใช้หรือ Framework ที่เรียกเมธอด GetVirtualPath ของ Route Collection แต่ละ Route จะมีเมธอด GetVirtualPath ถูกเรียกตามลำดับจนกว่าจะได้ VirtualPathData ที่ไม่ใช่ null
การสร้าง Routes
Routing จัดเตรียมคลาส Route เป็นการ implement มาตรฐานของ IRouter Route ใช้ Route Template Syntax เพื่อกำหนด Pattern ที่จะจับคู่กับ URL Path เมื่อ RouteAsync ถูกเรียก Route จะใช้ Route Template เดียวกันเพื่อสร้าง URL เมื่อ GetVirtualPath ถูกเรียก
ตัวอย่าง
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}"
);
Framework จัดเตรียมชุด Extension Methods สำหรับสร้าง Routes เช่น:
MapRoute, MapGet, MapPost, MapPut, MapDelete, MapVerb
Attribute Routing
นอกจาก Convention-based Routing แล้ว ASP.NET Core ยังรองรับ Attribute Routing ซึ่งกำหนด Route โดยตรงบน Controller และ Action:
[Route("api/[controller]")]
public class ProductsController : Controller {
[HttpGet("{id}")]
public IActionResult GetById(int id) { ... }
[HttpPost]
public IActionResult Create(Product product) { ... }
}