Hosting Out-of-process (chạy ngoài tiến trình) với IIS và ASP.NET Core
Vì các ứng dụng ASP.NET Core chạy trong một tiến trình (process) riêng biệt so với tiến trình worker của IIS, ASP.NET Core Module (mô-đun ASP.NET Core) chịu trách nhiệm quản lý tiến trình. Module khởi động tiến trình cho ứng dụng ASP.NET Core khi yêu cầu đầu tiên đến và khởi động lại ứng dụng nếu nó tắt hoặc bị crash. Về cơ bản đây là hành vi giống như các ứng dụng chạy in-process (trong tiến trình) đượ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, và một ứng dụng được host theo mô hình out-of-process:
!ASP.NET Core Module trong kịch bản hosting out-of-process
- Các yêu cầu đến từ web qua driver HTTP.sys ở kernel-mode.
- Driver định tuyến các yêu cầu đến IIS trên cổng (port) đã cấu hình của website. Cổng được cấu hình thường là 80 (HTTP) hoặc 443 (HTTPS).
- Module chuyển tiếp các yêu cầu đến Kestrel trên một cổng ngẫu nhiên cho ứng dụng. Cổng ngẫu nhiên này không phải 80 hoặc 443.
ASP.NET Core Module chỉ định cổng thông qua một biến môi trường (environment variable) khi khởi động. Extension UseIISIntegration 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 yêu cầu không xuất phát từ module sẽ bị từ chối. Module không hỗ trợ chuyển tiếp HTTPS. Các yêu cầu được chuyển tiếp qua HTTP ngay cả khi IIS nhận chúng qua HTTPS.
Sau khi Kestrel nhận yêu cầu từ module, yêu cầu được chuyển vào pipeline middleware (phần mềm trung gian) của ASP.NET Core. Pipeline middleware xử lý yêu cầu và truyền nó dưới dạng một instance HttpContext vào logic của ứng dụng. Middleware được thêm bởi IIS Integration cập nhật scheme, remote IP, và pathbase để tính đến việc chuyển tiếp yêu cầu đến Kestrel. Response của ứng dụng được truyền lại cho IIS, IIS sau đó chuyển tiếp nó về HTTP client đã khởi tạo yêu cầu.
Để biết hướng dẫn cấu hình ASP.NET Core Module, xem ASP.NET Core Module (ANCM) for IIS.
Để biết thêm thông tin về hosting, xem Host in ASP.NET Core.
Cấu hình ứng dụng
Bật các thành phần IISIntegration
Khi xây dựng host trong CreateHostBuilder (Program.cs), gọi CreateDefaultBuilder để bật tích hợp IIS:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
...Để biết thêm thông tin về CreateDefaultBuilder, xem .NET Generic Host in ASP.NET Core.
Mô hình hosting Out-of-process
Để cấu hình tùy chọn IIS, hãy bao gồm cấu hình service cho IISOptions trong ConfigureServices. Ví dụ sau ngăn ứng dụng điền vào HttpContext.Connection.ClientCertificate:
services.Configure<IISOptions>(options =>
{
options.ForwardClientCertificate = false;
});| Tùy chọn | Mặc định | Cài đặt |
|---|---|---|
AutomaticAuthentication | true | Nếu true, IIS Integration Middleware đặt HttpContext.User được xác thực bởi Windows Authentication. Nếu false, middleware chỉ cung cấp identity cho HttpContext.User và phản hồi các challenge khi được yêu cầu rõ ràng bởi AuthenticationScheme. Windows Authentication phải được bật trong IIS để AutomaticAuthentication hoạt động. |
AuthenticationDisplayName | null | Đặt tên hiển thị cho người dùng trên các trang đăng nhập. |
ForwardClientCertificate | true | Nếu true và header yêu cầu MS-ASPNETCORE-CLIENTCERT có mặt, HttpContext.Connection.ClientCertificate sẽ được điền. |
Kịch bản proxy server và load balancer
IIS Integration Middleware và ASP.NET Core Module được cấu hình để chuyển tiếp:
- Scheme (HTTP/HTTPS).
- Remote IP address nơi yêu cầu xuất phát.
IIS Integration Middleware cấu hình Forwarded Headers Middleware (middleware header được chuyển tiếp).
Cấu hình bổ sung có thể cần thiết cho các ứng dụng được host sau các proxy server và load balancer bổ sung. Để biết thêm thông tin, xem Configure ASP.NET Core to work with proxy servers and load balancers.
Mô hình hosting Out-of-process
Để cấu hình ứng dụng cho hosting out-of-process, hãy đặt giá trị của thuộc tính <AspNetCoreHostingModel> thành OutOfProcess trong project file (.csproj):
<PropertyGroup> <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel> </PropertyGroup>
In-process hosting được đặt với InProcess, đây là giá trị mặc định.
Giá trị của <AspNetCoreHostingModel> không phân biệt chữ hoa/thường, vì vậy inprocess và outofprocess đều hợp lệ.
Kestrel server được sử dụng thay vì IIS HTTP Server (IISHttpServer).
Đối với out-of-process, CreateDefaultBuilder gọi UseIISIntegration để:
- Cấu hình cổng và base path mà server sẽ lắng nghe khi chạy sau ASP.NET Core Module.
- Cấu hình host để bắt lỗi khởi động.
Tên tiến trình
Process.GetCurrentProcess().ProcessName báo cáo w3wp/iisexpress (in-process) hoặc dotnet (out-of-process).
Nhiều module native, chẳng hạn như Windows Authentication, vẫn hoạt động. Để tìm hiểu thêm về các IIS module hoạt động với ASP.NET Core Module, xem IIS modules with ASP.NET Core.
ASP.NET Core Module cũng có thể:
- Đặt biến môi trường cho tiến trình worker.
- Ghi log stdout ra file storage để khắc phục sự cố khởi động.
- Chuyển tiếp token xác thực Windows.