netcore進程內(InProcess)托管和進程外(out-of-Process)托管


當一個 ASP.NET Core 應用程序執行的時候,.NET 運行時會去查找 Main()方法,因為它是這個應用程序的起點。

然后,Main()方法調用靜態類WebHost中的靜態方法CreateDefaultBuilder()用於配置和設置 Web 服務器。

 

ASP.NET Core新增兩種Web服務器

1)、HTTP.sys 是僅在 Windows 上運行的適用於 ASP.NET Core 的 Web 服務器。 HTTP.sys 是 Kestrel 服務器的替代選擇,提供了一些 Kestrel 不提供的功能。

 重要

HTTP.sys 與 ASP.NET Core 模塊不兼容,無法與 IIS 或 IIS Express 結合使用。


2)、Kestrel 是一個跨平台的適用於 ASP.NET Core 的 Web 服務器。 Kestrel 是 Web 服務器,默認包括在 ASP.NET Core 項目模板中。

總結: HTTP.sys雖然可以替代IIS,它只能在windows上平台進行允許,但是實際中在windows平台上我們還是用IIS進行托管。

 

ASP.NET Core 應用程序可以托管在進程內(InProcess)或進程外(OutOfProcess)中。

進程內(InProcess)托管

若要配置 InProcess 宿主, 請將<AspNetCoreHostingModel>添加到應用的項目文件中, 其中的值為 InProcess

<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>

當我們選擇使用一個可用的項目模板,創建一個新的 ASP.NET Core 項目時,該項目默認為所有的 IIS 和 IIS Express 的配置都是作為進程內托管(InProcess)。

在 InProcess 托管的情況下,CreateDefaultBuilder()方法調用UseIIS()方法並在 IIS 工作進程**(w3wp.exe 或 iisexpress.exe)***內托管應用程序。

  • 從性能的角度來看,InProcess 托管比 OutOfProcess 托管提供了更高的請求吞吐量。
  • 對於 IIS,執行應用程序的進程名稱是w3wp,對於 IIS Express,它是iisexpress
  • 要獲取執行應用程序的進程名稱,請使用System.Diagnostics.Process.GetCurrentProcess().ProcessName
  • 當我們從 Visual Studio 運行項目時,它默認使用 IISExpress。
  • IIS Express是 IIS 的輕量級自包含版本,針對應用程序開發進行了優化。我們不會將它用於生產。在生產中我們會使用 IIS。

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

進程內托管方案中的 ASP.NET Core 模塊

 

使用 IIS 在 Windows 上托管 ASP.NET Core即可以是"進程內"也可以是"進程外"

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

 

ASP.NET Core 模塊是插入 IIS 管道的本機 IIS 模塊,用於:

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

受支持的 Windows 版本:

  • Windows 7 或更高版本
  • Windows Server 2008 R2 或更高版本

在進程內托管時,該模塊會使用 IIS 進程內服務器實現,即 IIS HTTP 服務器 (IISHttpServer)。‘

   在進程內,CreateDefaultBuilder 調用 UseIIS 

在進程外托管時,該模塊僅適用於 Kestrel。 該模塊無法與 HTTP.sys 一起工作。

  在進程外,CreateDefaultBuilder 調用 UseIISIntegration

 

進程外(out-of-Process)托管

  • 有 2 個 Web 服務器 ,內部 Web 服務器和外部 Web 服務器。
  • 內部 Web 服務器是 Kestrel, 外部 Web 服務器可以是 IIS,Nginx 或 Apache。
  • 使用 InProcess 托管,只有一個 Web 服務器,承載 asp.net Core 應用程序的 IIS。 因此,在內部和外部 Web 服務器之間,他們的代理和請求並沒有性能的損失。

什么是 Kestrel

Kestrel 是 ASP.NET Core 項目模板指定的默認 Web 服務器。

使用 Kestrel:

  • 本身作為邊緣服務器,處理直接來自網絡(包括 Internet)的請求。

 

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

Kestrel 通過反向代理服務器(如 IIS、Nginx 或 Apache)間接與 Internet 進行通信

 

 

 


免責聲明!

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



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