當一個 ASP.NET Core 應用程序執行的時候,.NET 運行時會去查找 Main()
方法,因為它是這個應用程序的起點。
然后,Main()
方法調用靜態類WebHost
中的靜態方法CreateDefaultBuilder()用於配置和設置 Web 服務器。
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 模塊和進程內托管的應用之間的關系:
進程外(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。