net core web服務器實現


net core 系列 18 web服務器實現

一. ASP.NET Core Module

 

  在介紹ASP.NET Core Web實現之前,先來了解下ASP.NET Core Module。該模塊是插入 IIS 管道的本機 IIS 模塊(本機是指程序所部署的服務器)。是基於windows平台處理 IIS和進程內IISHttpServer或Kestrel。用於:

 

  (1) 在 IIS 工作進程 (w3wp.exe) 內托管 ASP.NET Core 應用,稱為進程內托管模型。

 

  (2) 將 Web 請求轉發到運行 Kestrel 服務器的后端 ASP.NET Core 應用,稱為進程外托管模型。

 

  在進程內托管時,該模塊會使用 IIS 進程內服務器實現,即IISHttpServer。在進程外托管時,該模塊僅適用於 Kestrel。 該模塊與 HTTP.sys 不兼容。關於IIS 在 Windows 上托管 ASP.NET Core。安裝ASP.NET Core Model,在 "asp.net core 系列 9 環境" 中有介紹。

 

    --發布到iis上的配置節點    
    <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>

 

 

 

 

二.  windows平台web服務器介紹

 

  在windows平台下,asp.net core有以下幾種HTTP 服務器組件:

 

    (1) Kestrel服務器是默認跨平台 HTTP 服務器實現。

 

    (2) IISHttpServer 是IIS 的進程內服務器。

 

    (3) HTTP.sys 服務器是僅用於 Windows 的 HTTP 服務器,它基於 HTTP.sys 核心驅動程序和 HTTP 服務器 API。

 

  當使用 IIS 或 IIS Express 時,應用程序會在以下其中一個進程中運行:

 

    (1) 在IIS工作進程(進程內宿主模型)與IIS HTTP服務器的相同進程中。推薦配置為In-process(用於windows上進程內托管)。

 

    (2) 獨立於IIS工作進程(進程外宿主模型)的進程中使用Kestrel服務器。配置為OutOfProcess

 

 

 

  1.1  進程內托管模型 In-process hosting model

 

    使用進程內宿主,ASP.NET Core應用程序運行在與其IIS worker進程相同的進程中。進程內托管比進程外托管提供了更好的性能,因為請求不會通過環回適配器進行代理,環回適配器是一個網絡接口,將傳出的網絡流量返回到同一台機器。

 

    由 ASP.NET Core Module執行應用初始化:(1)加載CoreCLR、(2)調用 Program.Main。以及處理 IIS 本機請求的生存期。

 

    下圖說明了 IIS、ASP.NET Core Module和進程內托管的應用之間的關系:

 

 

     ASP.NET Core Module接收本機請求,並將它傳遞給 IISHttpServer 。 IISHttpServer 將請求從本機轉換為托管的 IIS 進程內服務器實現。

 

    IISHttpServer 處理請求之后,請求會被推送到 ASP.NET Core 中間件管道中。 中間件管道處理該請求並將其作為 HttpContext 實例傳遞給應用的邏輯(Application code)。 應用的響應傳遞回 IIS,IIS 將響應推送回發起請求的客戶端。

 

 

 

  1.2 進程外托管模型 Out-of-process hosting model

 

    因為ASP.NET Core運行在獨立於IIS工作進程的進程中, 因此該模塊負責進程管理。該模塊在第一個請求到達時啟動 ASP.NET Core 應用的進程,並在應用關閉或崩潰時重新啟動該應用。

 

    下圖說明了 IIS、ASP.NET Core Module和進程外托管的應用之間的關系:

 

 

    ASP.NET Core Module在啟動時通過環境變量指定端口,IIS 集成中間件將服務器配置為偵聽 http://localhost:{PORT}。 執行其他檢查,拒絕不是來自該ASP.NET Core Module的請求。

 

    Kestrel 從ASP.NET Core Module獲取請求后,請求會被推送到 ASP.NET Core 中間件管道中。 中間件管道處理該請求並將其作為 HttpContext 實例傳遞給應用的邏輯(Application code)。 IIS 集成添加的中間件會將方案、遠程 IP 和 pathbase 更新到帳戶以將請求轉發到 Kestrel。 應用的響應傳遞回 IIS,IIS 將響應推送回發起請求的 HTTP 客戶端。

 

   

 

    最后對於非windows平台, asp.net core使用Kestrel  Web服務器。這是默認跨平台 HTTP 服務器實現。

 

 

 

二.   Kestrel 服務器

 

  Kestrel 是 ASP.NET Core 項目模板中包括的默認 Web 服務器。默認情況下,ASP.NET Core 項目模板使用 Kestrel。 在 Program.cs 中,模板代碼調用 CreateDefaultBuilder,后者在后台調用 UseKestrel。Kestrel 的使用方式如下:

 

    (1) 它本身就是一個邊緣服務器,直接處理來自網絡(包括Internet)的請求。    

 

 

    (2) 與反向代理服務器(如 Internet Information Services (IIS)、Nginx 或 Apache)結合使用。 反向代理服務器接收來自 Internet 的 HTTP 請求,並將這些請求轉發到 Kestrel。

 

 

 

 

三. IISHTTPServer 服務器

 

   IISHTTPServer是 IIS 的進程內服務器且為進程內部署所必需。 ASP.NET Core Module 用於處理 IIS 和 IISHTTPServer之間的本機 IIS 請求。

 

  若要配置用於進程內托管的應用,請將 <AspNetCoreHostingModel> 屬性添加到值為 InProcess(進程外托管使用 OutOfProcess 進行設置)的應用項目文件。如果文件中不存在 <AspNetCoreHostingModel> 屬性,則默認值為 OutOfProcess

 

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

 

    InProcess時使用 IIS HTTP 服務器 (IISHttpServer) 而不是 Kestrel 服務器。OutOfProcess時使用 Kestrel 服務器,而不是 IIS HTTP 服務器 (IISHttpServer)

 

 

 

四. HTTP.sys服務器

 

         如果 ASP.NET Core 應用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項。為了獲得最佳性能,通常建議使用 Kestrel。 在應用向 Internet 公開且所需功能受 HTTP.sys(而不是 Kestrel)支持的方案中,可以使用 HTTP.sys。

 

 

  配置 ASP.NET Core 應用以使用 HTTP.sys。構建 Web 主機時調用 UseHttpSys 擴展方法,同時指定所需的 HTTP.sys 選項。在 Visual Studio 中,默認啟動配置文件是針對 IIS Express 的。 若要作為控制台應用運行該項目,請手動更改所選配置文件。

 

復制代碼
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseHttpSys(options =>
        {
            // The following options are set to default values.
            options.Authentication.Schemes = AuthenticationSchemes.None;
            options.Authentication.AllowAnonymous = true;
            options.MaxConnections = null;
            options.MaxRequestBodySize = 30000000;
            options.UrlPrefixes.Add("http://localhost:5000");
        });
復制代碼

 

  

 

五. http/2.0支持

 

  以下部署方案中的 ASP.NET Core 支持 HTTP/2

 

    

 

Kestrel

操作系統:

Windows Server 2016/Windows 10 或更高版本

具有 OpenSSL 1.0.2 或更高版本的 Linux

macOS 的未來版本將支持 HTTP/2

目標框架:

.NET Core 2.2 或更高版本

HTTP.sys

操作系統:

Windows Server 2016/Windows 10 或更高版本

目標框架:

不適用於 HTTP.sys部署。

IIS(進程內)

操作系統:

Windows Serve IIS 10 或更高版本

IIS 10 或更高版本

目標框架:

.NET Core 2.2 或更高版本

IIS(進程外)

操作系統:

Windows Serve IIS 10 或更高版本

IIS 10 或更高版本

面向公眾的邊緣服務器連接使用 HTTP/2,但與 Kestrel 的反向代理連接使用 HTTP/1.1。

目標框架:

不適用於 IIS 進程外部署。

 

 

 

  總結: 

 

    (1) ASP.NET Core Module模塊是適應於windows平台上的iis。

 

    (2) 進程內托管模型是使用 IISHttpServer是適應於windows平台上 IIS 的進程內服務器,。將ASP.NET Core Module接收的請求轉換為托管的 IIS 進程內服務器實現。用IISHttpServer服務器。

 

    (3) 進程外托管模型是獨立於iis, 可以做反向代理, 用Kestrel 服務器,可以應用在windows或linux平台上。

 

    (4) 如果 ASP.NET Core 應用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項。為了獲得最佳性能,通常建議使用 Kestrel。 

 

    (5) Kestrel 是 ASP.NET Core 項目模板中默認 Web 服務器.可以結合反向代理服務器一起使用(如 Internet Information Services (IIS)、Nginx 或 Apache)。

 

   

 

 

 

 

 

  參考文獻:

 

    ASP.NET Core 中的 Kestrel Web 服務器參數設置

 

      https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.2

 

    ASP.NET Core 中的 HTTP.sys Web 服務器參數設置

 

      https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-2.2

 

    關於ASP.NET Core 中的aspnet-core-module

 

        https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2

 

    使用 Nginx 在 Linux 上托管 ASP.NET Core

 

      https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2

 

    關於Linux 上 .NET Core 的先決條件

 

      https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2x


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM