使用 IIS 和 ASP.NET Core 進行跨處理序裝載

因為 ASP.NET Core 應用程式執行所在的處理序會與 IIS 工作者處理序分開,所以 ASP.NET Core 模組會執行處理程序管理。 此模組會在第一個要求到達時啟動 ASP.NET Core 應用程式的處理序,並在應用程式關閉或損毀時將它重新啟動。 此行為基本上與執行同處理序,並由 Windows 處理序啟用服務 (WAS) 所管理的應用程式相同。

下圖說明 IIS、ASP.NET Core 模組和跨處理序裝載應用程式之間的關聯性:

ASP.NET Core Module in the out-of-process hosting scenario

  1. 要求會從 Web 到達核心模式的 HTTP.sys 驅動程式。
  2. 驅動程式會在網站設定的通訊埠上將要求路由至 IIS。 設定的通訊埠通常是 80 (HTTP) 或 443 (HTTPS)。
  3. 此模組會在應用程式的隨機通訊埠上將要求轉送至 Kestrel。 隨機通訊埠並不是 80 或 443。

ASP.NET Core 模組會在啟動時透過環境變數指定通訊埠。 UseIISIntegration 擴充功能會將伺服器設定為在 http://localhost:{PORT} 上接聽。 將會執行額外檢查,不是源自模組的要求都會遭到拒絕。 模組不支援 HTTPS 轉送。 即使由 IIS 透過 HTTPS 接收,要求還是會透過 HTTP 轉送。

Kestrel 收取來自模組的要求之後,要求會被轉送至 ASP.NET Core 中介軟體管線。 中介軟體管線會處理要求,並將其作為 HttpContext 執行個體傳遞至應用程式的邏輯。 IIS Integration 新增的中介軟體會更新配置、遠端 IP 和帳戶路徑基底,以將要求轉送至 Kestrel。 應用程式的回應會傳回 IIS,而 IIS 會將其轉送回起始要求的 HTTP 用戶端。

如需 ASP.NET Core 模組設定指引,請參閱適用於 IIS 的 ASP.NET Core 模組 (ANCM)

如需代管的詳細資訊,請參閱在 ASP.NET Core 中代管

應用程式設定

啟用 IISIntegration 元件

CreateHostBuilder (Program.cs) 中建置主機時,呼叫 CreateDefaultBuilder 以啟用 IIS 整合:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        ...

如需關於 CreateDefaultBuilder 的詳細資訊,請參閱 ASP.NET Core 中的 .NET 泛型主機

跨處理序裝載模型

若要設定 IIS 選項,請在 ConfigureServices 中加入 IISOptions 的服務設定。 下列範例會防止應用程式填入 HttpContext.Connection.ClientCertificate

services.Configure<IISOptions>(options => 
{
    options.ForwardClientCertificate = false;
});
選項 預設 設定
AutomaticAuthentication true 若為 trueIIS 整合中介軟體會設定由 Windows 驗證所驗證的 HttpContext.User。 如果為 false,則驗證中介軟體僅針對 HttpContext.User 提供身分識別,並在游 AuthenticationScheme 提出明確要求時回應挑戰。 必須在 IIS 中啟用 Windows 驗證以讓 AutomaticAuthentication 作用。 如需詳細資訊,請參閱 Windows 驗證主題。
AuthenticationDisplayName null 設定使用者在登入頁面上看到的顯示名稱。
ForwardClientCertificate true 如果為 trueMS-ASPNETCORE-CLIENTCERT 要求標頭已存在,則會填入 HttpContext.Connection.ClientCertificate

Proxy 伺服器和負載平衡器案例

IIS 整合中介軟體和 ASP.NET Core 模組設定為轉送:

  • 配置 (HTTP/HTTPS)。
  • 發出要求的遠端 IP 位址。

IIS 整合中介軟體會設定轉送標頭中介軟體。

其他 Proxy 伺服器和負載平衡器後方託管的應用程式可能需要其他設定。 如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器

跨處理序裝載模型

若要設定應用程式進行跨處理序裝載,請在專案檔中將屬性的值 <AspNetCoreHostingModel> 設定為 OutOfProcess (.csproj):

<PropertyGroup>
  <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

同處理序裝載會設定為 InProcess,此為預設值。

<AspNetCoreHostingModel> 的值不區分大小寫,因此 inprocessoutofprocess 都是有效的值。

使用 Kestrel 伺服器,而不是 IIS HTTP 伺服器 (IISHttpServer)。

若為跨處理序作業,CreateDefaultBuilder 會呼叫 UseIISIntegration 以便:

  • 設定伺服器在 ASP.NET Core 模組後方執行時應該接聽的連接埠和基底路徑。
  • 設定主機以擷取啟動錯誤。

程序名稱。

Process.GetCurrentProcess().ProcessName 會報告 w3wp/iisexpress (同處理序) 或 dotnet (跨處理序)。

許多如 Windows 驗證等原生模組仍在使用中。 若要深入了解搭配 ASP.NET Core 模組的使用中 IIS 模組,請參閱與 ASP.NET Core 搭配運作的 IIS 模組

ASP.NET Core 模組也可以:

  • 設定背景工作處理序的環境變數。
  • 將 stdout 輸出記錄到檔案儲存區,以針對啟動問題進行疑難排解。
  • 轉送 Windows 驗證權杖。