Nguon: Microsoft Learn · .NET 8.0

Các triển khai Web Server (máy chủ web) trong ASP.NET Core

Nguồn: Web server implementations in ASP.NET Core | Phiên bản: .NET 8.0

Bởi Tom Dykstra, Steve Smith, Stephen Halter, và Chris Ross

Một ứng dụng ASP.NET Core chạy với một triển khai HTTP server (máy chủ HTTP) in-process (trong tiến trình). Server implementation (triển khai máy chủ) lắng nghe các HTTP request (yêu cầu HTTP) và đưa chúng vào ứng dụng dưới dạng tập hợp các request features (tính năng yêu cầu) được tổng hợp thành một HttpContext.

Trong bài viết này

Lưu ý: Đây không phải là phiên bản mới nhất của bài viết này. Để xem phiên bản hiện tại, hãy xem phiên bản .NET 10 của bài viết này.

Cảnh báo: Phiên bản ASP.NET Core này không còn được hỗ trợ. Để biết thêm thông tin, hãy xem Chính sách hỗ trợ .NET và .NET Core. Để xem phiên bản hiện tại, hãy xem phiên bản .NET 10 của bài viết này.


Windows

ASP.NET Core đi kèm với các thành phần sau:

Khi sử dụng IIS (Internet Information Services) hoặc IIS Express, ứng dụng chạy theo một trong hai cách:

ASP.NET Core Module (mô-đun ASP.NET Core) là một IIS module (mô-đun IIS) gốc xử lý các native IIS request (yêu cầu IIS gốc) giữa IIS và in-process IIS HTTP Server hoặc Kestrel. Để biết thêm thông tin, hãy xem ASP.NET Core Module (ANCM) for IIS.


Kestrel vs. HTTP.sys

Kestrel có các ưu điểm sau so với HTTP.sys:

HTTP.sys hoạt động như một shared kernel mode component (thành phần chế độ nhân dùng chung) với các tính năng mà Kestrel không có:


Các mô hình Hosting

Có một số hosting model (mô hình hosting) khả dụng:

Để biết thêm thông tin, hãy xem các tài nguyên sau:


Kestrel

Kestrel server (máy chủ Kestrel) là triển khai HTTP server mặc định, đa nền tảng. Kestrel cung cấp hiệu suất và mức sử dụng bộ nhớ tốt nhất, nhưng không có một số tính năng nâng cao của HTTP.sys. Để biết thêm thông tin, hãy xem Kestrel vs. HTTP.sys trong tài liệu này.

Sử dụng Kestrel:

!Kestrel giao tiếp trực tiếp với Internet mà không cần reverse proxy server

!Kestrel giao tiếp gián tiếp với Internet thông qua reverse proxy server, chẳng hạn như IIS, Nginx, hoặc Apache

Cả hai cấu hình hosting — có hoặc không có reverse proxy server — đều được hỗ trợ.

Để biết hướng dẫn cấu hình Kestrel và thông tin về thời điểm sử dụng Kestrel trong cấu hình reverse proxy, hãy xem Kestrel web server in ASP.NET Core.


IIS với Kestrel (mô hình out-of-process)

Khi sử dụng IIS (Internet Information Services) hoặc IIS Express, ứng dụng chạy trong một tiến trình riêng biệt với IIS worker process (out-of-process) với Kestrel server (máy chủ Kestrel).

Vì các ứng dụng ASP.NET Core chạy trong một tiến trình riêng biệt với IIS worker process, module (mô-đun) xử lý việc quản lý tiến trình. Module khởi động tiến trình cho ứng dụng ASP.NET Core khi request (yêu cầu) đầu tiên đến và khởi động lại ứng dụng nếu nó tắt hoặc gặp sự cố. Về cơ bản, đây là hành vi tương tự như các ứng dụng chạy in-process được quản lý bởi Windows Process Activation Service (WAS).

Sơ đồ sau minh họa mối quan hệ giữa IIS, ASP.NET Core Module (mô-đun ASP.NET Core), và một ứng dụng được host theo mô hình out-of-process:

!ASP.NET Core Module

Các request (yêu cầu) đến từ web thông qua kernel-mode HTTP.sys driver (trình điều khiển nhân HTTP.sys). Driver định tuyến các request đến IIS trên port (cổng) được cấu hình của website, thường là 80 (HTTP) hoặc 443 (HTTPS). Module chuyển tiếp các request đến Kestrel trên một port ngẫu nhiên cho ứng dụng, không phải là port 80 hay 443.

Module chỉ định port thông qua một biến môi trường (environment variable) khi khởi động, và IIS Integration Middleware cấu hình server để lắng nghe trên http://localhost:{port}. Các kiểm tra bổ sung được thực hiện, và các request không xuất phát từ module sẽ bị từ chối. Module không hỗ trợ HTTPS forwarding (chuyển tiếp HTTPS), vì vậy các request được chuyển tiếp qua HTTP ngay cả khi được IIS nhận qua HTTPS.

Sau khi Kestrel nhận request (yêu cầu) từ module, request được đẩy vào ASP.NET Core middleware pipeline (đường ống middleware). Middleware pipeline xử lý request và chuyển nó như một instance HttpContext đến logic của ứng dụng. Middleware được thêm bởi IIS Integration cập nhật scheme (lược đồ), remote IP (địa chỉ IP từ xa), và pathbase để tính đến việc chuyển tiếp request đến Kestrel. Response (phản hồi) của ứng dụng được chuyển trả lại cho IIS, rồi IIS đẩy nó ra ngoài đến HTTP client (máy khách HTTP) đã khởi tạo request.

Để biết hướng dẫn cấu hình IIS và ASP.NET Core Module (mô-đun ASP.NET Core), hãy xem các chủ đề sau:

Nginx với Kestrel

Để biết thông tin về cách sử dụng Nginx trên Linux làm reverse proxy server (máy chủ proxy ngược) cho Kestrel, hãy xem Host ASP.NET Core on Linux with Nginx.


HTTP.sys

Nếu các ứng dụng ASP.NET Core chạy trên Windows, HTTP.sys là một giải pháp thay thế cho Kestrel. Kestrel được khuyến nghị hơn HTTP.sys trừ khi ứng dụng yêu cầu các tính năng không có trong Kestrel. Để biết thêm thông tin, hãy xem HTTP.sys web server implementation in ASP.NET Core.

!HTTP.sys giao tiếp trực tiếp với Internet

HTTP.sys cũng có thể được sử dụng cho các ứng dụng chỉ được hiển thị trong mạng nội bộ.

!HTTP.sys giao tiếp trực tiếp với mạng nội bộ

Để biết hướng dẫn cấu hình HTTP.sys, hãy xem HTTP.sys web server implementation in ASP.NET Core.


Cơ sở hạ tầng ASP.NET Core server

IApplicationBuilder có sẵn trong phương thức Startup.Configure hiển thị thuộc tính ServerFeatures thuộc kiểu IFeatureCollection. Kestrel và HTTP.sys mỗi cái chỉ hiển thị một tính năng duy nhất là IServerAddressesFeature, nhưng các triển khai server khác nhau có thể hiển thị thêm chức năng.

IServerAddressesFeature có thể được sử dụng để tìm hiểu xem triển khai server đã bind (liên kết) tại port nào trong runtime (thời gian chạy).


Custom servers (máy chủ tùy chỉnh)

Nếu các server tích hợp sẵn không đáp ứng yêu cầu của ứng dụng, có thể tạo một triển khai server tùy chỉnh. Open Web Interface for .NET (OWIN) guide trình bày cách viết một triển khai IServer dựa trên Nowin. Chỉ các feature interface (giao diện tính năng) mà ứng dụng sử dụng mới cần được triển khai, mặc dù tối thiểu phải hỗ trợ IHttpRequestFeatureIHttpResponseFeature.


Khởi động Server

Server được khởi chạy khi Integrated Development Environment (IDE — môi trường phát triển tích hợp) hoặc editor (trình chỉnh sửa) khởi động ứng dụng:

Khi khởi chạy ứng dụng từ command prompt (dấu nhắc lệnh) trong thư mục dự án, dotnet run khởi chạy ứng dụng và server (chỉ Kestrel và HTTP.sys). Cấu hình được chỉ định bởi tùy chọn -c|--configuration, được đặt thành Debug (mặc định) hoặc Release.

Tệp launchSettings.json cung cấp cấu hình khi khởi chạy ứng dụng bằng dotnet run hoặc bằng debugger được tích hợp trong các công cụ như Visual Studio. Nếu có launch profile trong tệp launchSettings.json, hãy sử dụng tùy chọn --launch-profile {PROFILE NAME} với lệnh dotnet run hoặc chọn profile trong Visual Studio. Để biết thêm thông tin, hãy xem dotnet run.NET distribution packaging.


Hỗ trợ HTTP/2

HTTP/2 được hỗ trợ với ASP.NET Core trong các kịch bản triển khai sau:

Windows

macOS

Linux


†Kestrel có hỗ trợ giới hạn cho HTTP/2 trên Windows Server 2012 R2 và Windows 8.1. Hỗ trợ bị giới hạn vì danh sách các TLS cipher suite (bộ mật mã TLS) được hỗ trợ trên các hệ điều hành này bị giới hạn. Có thể cần một certificate (chứng chỉ) được tạo bằng Elliptic Curve Digital Signature Algorithm (ECDSA — thuật toán chữ ký số đường cong elliptic) để bảo mật các kết nối TLS.

Một kết nối HTTP/2 phải sử dụng Application-Layer Protocol Negotiation (ALPN — đàm phán giao thức tầng ứng dụng) và TLS 1.2 trở lên. Để biết thêm thông tin, hãy xem các chủ đề liên quan đến kịch bản triển khai server của bạn.


Các mẫu ứng dụng web doanh nghiệp

Để được hướng dẫn về cách tạo một ứng dụng ASP.NET Core đáng tin cậy, bảo mật, hiệu quả, có thể kiểm tra và có khả năng mở rộng, hãy xem Enterprise web app patterns (các mẫu ứng dụng web doanh nghiệp). Một ứng dụng web mẫu hoàn chỉnh đạt chất lượng sản xuất, triển khai các mẫu này, có sẵn để tham khảo.


Tài nguyên bổ sung