Request Life Cycle trong ASP.NET Core

Requets life cycle (vòng đời request) trong ASP.NET Core MVC là một chuỗi các sự kiện, giai đoạn hoặc các thành phần tương tác với nhau để xử lý HTTP request và trả về response cho client.

Request Life Cycle trong ASP.NET Core

Bây giờ chúng ta sẽ tìm hiểu chi tiết các thành phần có trong biểu đồ trên.

Tìm hiểu một số khái niệm

Request Pipeline là gì?

Request Pipeline (đường ống request) là cơ chế được bắt đầu từ khi request được xử lý tới khi trả về một response. Request đến từ trình duyệt đi qua request pipeline và quay trở lại khi xử lý xong để trả về response cho client. Các thành phần đơn lẻ tạo nên request pipeline này được gọi là middleware.

Middleware là gì?

Middleware là thành phần tạo thành request pipeline để xử lý request và tạo ra response phản hồi lại client. Mỗi một middleware thao tác với các request nhận được từ middleware trước nó. Nó cũng có thể quyết định gọi middleware tiếp theo trong pipeline hoặc trả về response cho middleware ngay trước nó.

Routing

Routing là một middleware được triển khai trong MVC framework. Routing middleware  quyết định cách một request được gửi đến có thể được ánh xạ tới Controller và Action Method nào nhờ sự trợ giúp của các cấu hình tuyến.

Khởi tạo Controller

Ở giai đoạn này của request lifecycle trong ASP.NET MVC Core, quá trình khởi tạo và thực thi Controller diễn ra. Controller có trách nhiệm xử lý các request được gửi đến. Controller lựa chọn Action Method thích hợp trên cơ sở các mẫu định tuyến được cung cấp.

Thực thi Action Method

Sau khi Controller được khởi tạo, Action Method được thực thi và trả về Result (kết quả).

Thực thi Result

Trong giai đoạn này của request lifecycle trong ASP.NET MVC Core, Result tức là response được tạo cho request HTTP ban đầu, sẽ được thực thi. Nếu Action Method trả về có dạng ViewResult, MVC view engine sẽ render và trả về phản hồi HTML. Nếu kết quả không phải là ViewResult thì Action Method sẽ tạo ra phản hồi của riêng nó.  

Bây giờ, chúng ta sẽ thảo luận ngắn gọn về từng giai đoạn:

Middleware

Middleware là thành phần được kết hợp để tạo thành một request pipeline để xử lý bất kỳ yêu cầu nào đến.

Bất cứ khi nào một yêu cầu mới đến, nó sẽ được chuyển đến middleware đầu tiên. Sau đó, middleware quyết định tạo response sau khi xử lý request gửi đến hay chuyển nó cho middleware tiếp theo. Sau khi request được xử lý, response được gửi lại với các middleware  này.

Bây giờ, chúng ta sẽ tạo một middleware đơn giản trả về text bằng cách tạo lớp ContentComponent.cs như sau.

using System.Text;  
using System.Threading.Tasks;  
using Microsoft.AspNetCore.Http;  

namespace WebApplication  
{  
   public class ContentComponent   
   {  
      private RequestDelegate nextComponent;  
      
      public ContentComponent(RequestDelegate nextMiddleware) => nextComponent = nextMiddleware;  
      
      public async Task Invoke(HttpContext httpContext)  
      {  
         if (httpContext.Request.Path.ToString().ToLower() == "/edit")  
         {  
            await httpContext.Response.WriteAsync("This is edit URL component", Encoding.UTF8);  
         }  
         else
         {  
            await nextComponent.Invoke(httpContext);  
         }  
      }  
   }  
}

Middleware ContentComponent này định nghĩa một phương thức khởi tạo và bên trong phương thức khởi tạo đó nhận đối tượng RequestDelegate. Đối tượng RequestDelegate này đại diện cho thành phần phần mềm trung gian tiếp theo.

Middleware ContentComponent cũng định nghĩa một phương thức Invoke. Khi ứng dụng ASP.NET Core nhận được một request đến, phương thức Invoke sẽ được gọi.

Đối số HttpContext của phương thức Invoke cung cấp thông tin về HTTP request và response được tạo sẽ được gửi lại cho client.

Phương thức Invoke của  lớp ContentComponent kiểm tra xem request đến có được gửi đến URL /edit hay không. Nếu request được gửi đến URL /edit thì sẽ trả về response là This is edit URL component.

Routing

Routing là một middleware được triển khai trong MVC framework. Trong ASP.NET Core, hệ thống định tuyến được sử dụng để xử lý các URL.

Routing middleware quyết định cách một yêu cầu đến có thể được ánh xạ tới Controller và các Action Method, với sự trợ giúp của cấu hình định tuyến.

Routing kết nối Middleware và MVC framework bằng cách ánh xạ request đến với các Action Method của Controller.

Trong một ứng dụng cụ thể, MVC đăng ký một hoặc nhiều tuyến đường bằng cách sử dụng phương thức MapRoute (.NET Core version 2.x trở về trước) hoặc MapControllerRoute (.NET Core version 3.x hoặc mới hơn).

Routing Pipeline

ASP.NET Core MVC Routing Pipeline

Trong ASP.NET Core, routing ánh xạ một request đến lớp RouteHandler, sau đó được chuyển dưới dạng tập hợp các tuyến đến Routing Middleware.

Routing Middleware thực thi MVC RouteHandler cho mỗi tuyến. Nếu một Controller và Action Method phù hợp được tìm thấy trên một tuyến cụ thể, thì dữ liệu được yêu cầu sẽ được chuyển tiếp đến phần còn lại của MVC Framework sẽ tạo ra phản hồi. Có hai loại routing có sẵn trong MVC là:

Cấu hình Routing

Loại định tuyến này sử dụng các mẫu định tuyến của ứng dụng để khớp một URL với các Action Method của Controller.

Phương pháp cấu hình routing được triển khai bên trong file Startup.cs. Trong Startup.cs, phương thức UseEndpoints() đăng ký các tuyến đang được cung cấp cho nó dưới dạng tham số bên trong phương thức MapControllerRoute.

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }
    
    //....
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    
        app.UseEndpoints(endpoints =>
        {
            //....
        
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

Routing Attribute

Loại định tuyến này được thực hiện thông qua RouteAttribute và được sử dụng trực tiếp cho Controller hoặc Action Method cụ thể.

RoutingAttribute được định nghĩa bên trên một Action Method trong Controller như sau:

public class AuthenController : Controller
{

    [Route("/login")]
    public IActionResult Login(string returnUrl = null)
    {
        SetTitle("Đăng nhập");
        if (User.Identity.IsAuthenticated)
        {
            return LocalRedirect(returnUrl ?? "/admin");
        }
        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }
}

Khởi tạo Controller

Ở giai đoạn này, quá trình khởi tạo và thực thi Controller diễn ra. Controller chịu trách nhiệm xử lý các request đến được thực hiện bằng cách ánh xạ yêu cầu tới Action Method thích hợp.

Bộ điều khiển lựa chọn Action Method thích hợp (để trả về response) trên cơ sở các mẫu định tuyến được cung cấp.

Khởi tạo Controller

MVC RouteHandler chịu trách nhiệm chọn một action method ở dạng action descriptor. Sau đó, RouteHandler chuyển action descriptor vào trình thực thi Controller Action Invoker.

Lớp Controller Factory tạo ra thể hiện của controller để thực thi action method. Lớp Controller Factory phụ thuộc vào Controller Activator để khởi tạo controller.

Sau khi action method được chọn, thể hiện của controller sẽ thực thi action method xử lý yêu cầu. Thể hiện của controller cung cấp một số tính năng như action method, action filter và action result.

Trình kích hoạt sử dụng thuộc tính thông tin kiểu controller trên action descriptor để khởi tạo controller theo tên. Khi controller được tạo, phần còn lại của đường dẫn thực thi action method có thể thực thi.

Controller Factory là thành phần chịu trách nhiệm tạo thể hiện của controller. Controller Factory triển khai từ interface IControllerFactory. Interface này chứa hai phương thức được gọi là CreateController và ReleaseController.

Quy trình thực thi Action Method

ASP.NET Core MVCASP.NET Core
Bài Viết Liên Quan:
10 thư viện .NET Core hàng đầu mà mọi nhà phát triển web nên biết
Trung Nguyen 08/04/2021
10 thư viện .NET Core hàng đầu mà mọi nhà phát triển web nên biết

Trong bài viết này, tôi sẽ giới thiệu một số thư viện .NET Core hữu ích nhất mà mọi nhà phát triển cần biết.

ASP.NET Core vs Go: Hiệu suất HTTP của ai tốt hơn
Trung Nguyen 11/10/2020
ASP.NET Core vs Go: Hiệu suất HTTP của ai tốt hơn

Trong bài viết này, chúng tôi sẽ so sánh hiệu suất HTTP của ASP.NET Core và Go sử dụng mô hình kiến trúc MVC.

ASP.NET Core Dependency Injection: Best Practice, Mẹo và Thủ Thuật
Trung Nguyen 10/10/2020
ASP.NET Core Dependency Injection: Best Practice, Mẹo và Thủ Thuật

Trong bài viết này, tôi sẽ chia sẻ các best practice, mẹo và thủ thuật về việc sử dụng Dependency Injection (DI) trong ứng dụng ASP.NET Core.

View Layout, View Start, View Imports trong ASP.NET Core
Trung Nguyen 10/04/2020
View Layout, View Start, View Imports trong ASP.NET Core

View Layout, View Start, View Imports là gì? Lợi ích và các sử dụng View Layout, View Start, View Imports trong ASP.NET Core.