.NET Core middleware pipeline

Anh PhanAnh Phan
3 min read

Từ khoá middleware được sử dụng trong nhiều ngữ cảnh trong công nghệ phần mềm. Trong .NET Core, middleware là các C# class đứng giữa (middle) User và Controller, can thiệp vào request và response. Middleware có thể

  • Xử lý request và trả về response ngay lập tức, chặn không cho request chạm tới Controller.

  • Xử lý request, sửa đổi và chuyển tiếp đến một middleware khác.

  • Xử lý response, sửa đổi và chuyển tiếp đến một middleware khác hoặc trả về cho client.

  • Chồng lên nhau (vì thế nên được gọi là đường ống → pipeline)

Ta có thể sử dụng middleware theo nhiều cách khác nhau. Ví dụ: một logging middleware có thể ghi chú thời gian nhận request cho đến lúc trả về response.

Một trong những trường hợp sử dụng phổ biến nhất của middleware là dành cho các use case được sử dụng đi sử dụng lại mà tách biệt khỏi nhau (cross-cutting concerns). Bao gồm những khía cạnh như:

  • Logging mỗi request

  • Thêm security header cho response

  • Gắn thông tin user cho request

  • Điều chỉnh ngôn ngữ

Trong mỗi ví dụ này, middleware sẽ nhận được request, sửa đổi request đó, sau đó chuyển request đó đến middleware tiếp theo trong pipeline. Middleware tiếp theo có thể sử dụng các chi tiết được middleware trước đó thêm vào để xử lý request.

Nên nhớ rằng middleware được thực thi theo thứ tự chúng được add trong Program.cs (hoặc Startup.cs), và thứ tự này rất quan trọng.

Một số loại middleware sẵn có của hệ thống

Routing middleware

Mục đích: Đọc request url và http method và ánh xạ nó với endpoints đã được định nghĩa trong app (Controller actions, Razor Pages, Minimal API endpoints). Tuy nhiên routing middleware chỉ chọn đúng endpoint để xử lý request nhưng chưa hề thực thi.

Configuration: app.UseRouting();

Vị trí: Cần đặt trước bất kỳ middleware nào cần biết thông tin endpoint sẽ được thực thi. Thông thường sẽ là trước authentication, authorization middleware

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

Authentication middleware

  • Mục đích: Thực hiện xác thực người dùng.

  • Configuration: app.UseAuthentication();

  • Vị trí: Bắt buộc đặt sau UseRouting() (để biết được endpoint sẽ được thực thi có cần authentication không) nhưng phải đặt trước UseAuthorization() (vì authorization cần biết thông tin user trước khi phân quyền).

Authorization middleware

  • Mục đích: Quyết định cấp quyền người dùng, nếu người dùng không có đủ quyền hạn, authorization middleware sẽ trả về response luôn và không cần chuyển tiếp vào Controller Action

  • Configuration: app.UseAuthorization(); (Cần đăng ký authorization services như build.Services.AddAuthorization(...) vào Dependency Injection Container để middleware sử dụng).

  • Placement: Đặt sau UseAuthentication() (cần được biết thông tin của User)

Controller Action (endpoint middleware)

Nơi thực sự thực thi Controller action, nằm trong cùng trong middleware pipeline.

Thực chất ngoài controller action, đối với các kiểu project khác chúng gọi các hàm đó, như là:

  • Razor Page handler method.

  • Minimal API request delegate

  • SignalR Hub method.

  • gRPC Service method.

0
Subscribe to my newsletter

Read articles from Anh Phan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Anh Phan
Anh Phan