Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Routing trong C# ASP.NET Core là gì?

Routing được dùng để map request tới route handlers.

Routes được cấu hình khi ứng dụng khởi động, và có thể trích xuất giá trị từ URL sẽ được dùng cho xử lý request.

Routing cơ bản

Routing sử dụng routes (implementations của IRouter)

  • map incoming requests to route handlers (ánh xạ request đến route handlers)
  • generate URLs used in responses (tạo URL dùng trong response)

Routing được kết nối đến middleware pipeline bởi class RouterMiddleware. ASP.NET MVC thêm routing vào middleware pipeline như một phần của cấu hình của nó.

URL Matching (Khớp URL)

Incoming requests vào RouterMiddleware, nó gọi phương thức RouteAsync trên từng route theo trình tự.

Instance IRouter chọn có xử lý request không bằng cách set RouteContext Handler thành non-null RequestDelegate.

Nếu handler được set cho route, nó sẽ được invoke để xử lý request và không route nào khác được xử lý.

Nếu tất cả routes được thực thi và không tìm thấy handler cho request, middleware gọi next và middleware tiếp theo trong request pipeline được invoke.

URL Generation (Tạo URL)

URL generation tuân theo quy trình lặp tương tự, nhưng bắt đầu với user hoặc framework code gọi vào phương thức GetVirtualPath của route collection.

Mỗi route sẽ có phương thức GetVirtualPath được gọi theo trình tự cho đến khi một VirtualPathData non-null được trả về.

Tạo Routes

Routing cung cấp class Route như implementation chuẩn của IRouter. Route sử dụng route template syntax để định nghĩa patterns sẽ match với URL path khi RouteAsync được gọi.

Route sẽ sử dụng cùng route template để generate URL khi GetVirtualPath được gọi.

Ví dụ

routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");

Framework cung cấp tập hợp extension methods để tạo routes như:

MapRoute MapGet MapPost MapPut MapRoute MapVerb

Attribute Routing (Routing bằng Attribute)

ASP.NET Core cũng hỗ trợ Attribute Routing - định nghĩa route trực tiếp trên controller/action:

[Route("api/[controller]")]
public class ProductsController : ControllerBase {
    [HttpGet("{id}")]
    public IActionResult GetById(int id) { ... }
    
    [HttpGet("search")]
    public IActionResult Search(string term) { ... }
}

Route Constraints (Ràng buộc Route)

Có thể thêm ràng buộc cho tham số route:

[HttpGet("{id:int}")]           // Chỉ chấp nhận int
[HttpGet("{name:minlength(3)}")] // Độ dài tối thiểu 3
[HttpGet("{date:datetime}")]     // Format datetime
[HttpGet("{id:guid}")]           // Format GUID

Endpoint Routing (ASP.NET Core 3.0+)

Từ ASP.NET Core 3.0, Endpoint Routing được sử dụng:

public void Configure(IApplicationBuilder app) {
    app.UseRouting();        // Thêm routing vào pipeline
    app.UseEndpoints(endpoints => {
        endpoints.MapControllers();        // Attribute routing
        endpoints.MapRazorPages();         // Razor Pages
        endpoints.MapControllerRoute(      // Conventional routing
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}