使用 IIS 和 ASP.NET Core 進行程序內託管
程序內託管在與其 IIS 工作程序相同的程序中執行 ASP.NET Core 應用。 程序內承載相較程序外承載提供更優的效能,因為請求並不通過環回介面卡進行代理,環回介面卡是一個網路介面,用於將傳出的網路流量返回給同一計算機。
下圖說明了 IIS、ASP.NET Core 模組和程序內託管的應用之間的關係:
啟用程序內託管
自 ASP.NET Core 3.0 起,預設情況下已為部署到 IIS 的所有應用啟用程序內託管。
若要顯式配置程序內託管的應用,請在專案檔案 (.csproj
) 中將<AspNetCoreHostingModel>
屬性的值設定為InProcess
:
<PropertyGroup>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
一般體系結構
請求的常規流程如下:
- 請求從 Web 到達核心模式 HTTP.sys 驅動程式。
- 驅動程式將本機請求路由到網站的配置埠上的 IIS,通常為 80 (HTTP) 或 443 (HTTPS)。
- ASP.NET Core 模組接收本機請求,並將其傳遞給 IIS HTTP 伺服器 (
IISHttpServer
)。 IIS HTTP 伺服器是將請求從本機轉換為託管的 IIS 程序內伺服器實現。
在 IIS HTTP 伺服器處理請求後:
- 請求被髮送到 ASP.NET Core 中介軟體管道。
- 中介軟體管道處理該請求並將其作為
HttpContext
例項傳遞給應用的邏輯。 - 應用的響應通過 IIS HTTP 伺服器傳遞迴 IIS。
- IIS 將響應傳送到發起請求的客戶端。
CreateDefaultBuilder
新增IServer例項的方式是:呼叫UseIIS方法來啟動CoreCLR和將應用託管在 IIS 工作程序(w3wp.exe
或iisexpress.exe
)內。 效能測試表明,與在程序外託管應用並將請求代理傳入Kestrel相比,在程序中託管 .NET Core 應用可提供明顯更高的請求吞吐量。
作為單個檔案可執行檔案釋出的應用無法由程序內託管模型載入。
應用程式配置
要配置 IIS 選項,請在ConfigureServices中包括IISServerOptions的服務配置。 下面的示例禁用 AutomaticAuthentication:
C#services.Configure<IISServerOptions>(options =>
{
options.AutomaticAuthentication = false;
});
選項 | 預設 | 設定 |
---|---|---|
AutomaticAuthentication |
true |
若為true ,IIS 伺服器將設定經過Windows 身份驗證進行身份驗證的HttpContext.User 。 若為false ,伺服器僅提供HttpContext.User 的標識並在AuthenticationScheme 顯式請求時響應質詢。 必須在 IIS 中啟用 Windows 身份驗證使AutomaticAuthentication 得以執行。 有關詳細資訊,請參閱Windows 身份驗證。 |
AuthenticationDisplayName |
null |
設定在登入頁上向用戶顯示的顯示名。 |
AllowSynchronousIO |
false |
HttpContext.Request 和HttpContext.Response 是否允許同步 I/O。 |
MaxRequestBodySize |
30000000 |
獲取或設定HttpRequest 的最大請求正文大小。 請注意,IIS 本身有限制maxAllowedContentLength ,這一限制將在IISServerOptions 中設定MaxRequestBodySize 之前進行處理。 更改MaxRequestBodySize 不會影響maxAllowedContentLength 。 若要增加maxAllowedContentLength ,請在web.config 中新增一個將maxAllowedContentLength 設定為更高值的項。 有關更多詳細資訊,請參閱配置。 |
程序內和程序外託管之間的差異
在程序內託管時,將應用以下特徵:
-
使用 IIS HTTP 伺服器 (
IISHttpServer
),而不是Kestrel伺服器。 對於程序內託管,CreateDefaultBuilder會呼叫UseIIS來進行以下操作:- 註冊
IISHttpServer
。 - 在 ASP.NET Core 模組後執行時,配置伺服器應偵聽的埠和基本路徑。
- 配置主機以捕獲啟動錯誤。
- 註冊
-
requestTimeout
屬性不適用於程序內託管。 -
不支援在應用之間共享應用池。 每個應用使用一個應用池。
-
應用和已安裝的執行時(x64 或 x86)的體系結構(位數)必須與應用池的體系結構匹配。 例如,為 32 位 (x86) 釋出的應用必須已為其 IIS 應用程式池啟用 32 位。 有關詳細資訊,請參閱建立 IIS 站點部分。
-
檢測到客戶端連線斷開。 客戶端斷開連線時,將取消HttpContext.RequestAborted取消標記。
-
在程序內託管時,不會在內部呼叫AuthenticateAsync來初始化使用者。 因此,預設情況下不啟用每次身份驗證後用於轉換宣告的IClaimsTransformation實現。 使用IClaimsTransformation實現轉換宣告時,請呼叫AddAuthentication以新增身份驗證服務:
C#public void ConfigureServices(IServiceCollection services) { services.AddTransient<IClaimsTransformation, ClaimsTransformer>(); services.AddAuthentication(IISServerDefaults.AuthenticationScheme); } public void Configure(IApplicationBuilder app) { app.UseAuthentication(); }
-
不支援Web 包(單檔案)部署。
建議的內容
-
使用 IIS 和 ASP.NET Core 進行程序外託管
瞭解如何使用 IIS 和 ASP.NET Core 模組進行程序外託管。
-
ASP.NET Core 模組
瞭解用於通過 IIS 託管 ASP.NET Core 應用的 ASP.NET Core 模組。
-
IIS 模組與 ASP.NET Core
瞭解適用於 ASP.NET Core 應用的活動和非活動 IIS 模組以及如何管理 IIS 模組。
-
ASP.NET Core 模組的日誌建立和重定向
配置 IIS 和 ASP.NET Core 模組以捕獲日誌和診斷資訊。