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.
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.
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à 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 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.
Ở 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.
Sau khi Controller được khởi tạo, Action Method được thực thi và trả về Result (kết quả).
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 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 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).
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à:
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?}");
});
}
}
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();
}
}
Ở 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.
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.
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.
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.
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 là gì? Lợi ích và các sử dụng View Layout, View Start, View Imports trong ASP.NET Core.