1. 程式人生 > 其它 >使用 IIS 和 ASP.NET Core 進行程序內託管

使用 IIS 和 ASP.NET Core 進行程序內託管

程序內託管在與其 IIS 工作程序相同的程序中執行 ASP.NET Core 應用。 程序內承載相較程序外承載提供更優的效能,因為請求並不通過環回介面卡進行代理,環回介面卡是一個網路介面,用於將傳出的網路流量返回給同一計算機。

下圖說明了 IIS、ASP.NET Core 模組和程序內託管的應用之間的關係:

啟用程序內託管

自 ASP.NET Core 3.0 起,預設情況下已為部署到 IIS 的所有應用啟用程序內託管。

若要顯式配置程序內託管的應用,請在專案檔案 (.csproj) 中將<AspNetCoreHostingModel>屬性的值設定為InProcess

XML
<PropertyGroup>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>

一般體系結構

請求的常規流程如下:

  1. 請求從 Web 到達核心模式 HTTP.sys 驅動程式。
  2. 驅動程式將本機請求路由到網站的配置埠上的 IIS,通常為 80 (HTTP) 或 443 (HTTPS)。
  3. ASP.NET Core 模組接收本機請求,並將其傳遞給 IIS HTTP 伺服器 (IISHttpServer)。 IIS HTTP 伺服器是將請求從本機轉換為託管的 IIS 程序內伺服器實現。

在 IIS HTTP 伺服器處理請求後:

  1. 請求被髮送到 ASP.NET Core 中介軟體管道。
  2. 中介軟體管道處理該請求並將其作為HttpContext例項傳遞給應用的邏輯。
  3. 應用的響應通過 IIS HTTP 伺服器傳遞迴 IIS。
  4. IIS 將響應傳送到發起請求的客戶端。

CreateDefaultBuilder新增IServer例項的方式是:呼叫UseIIS方法來啟動CoreCLR和將應用託管在 IIS 工作程序(w3wp.exeiisexpress.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.RequestHttpContext.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 模組以捕獲日誌和診斷資訊。