這篇文章中,我將詳細介紹ASP.NET Core OutOfProcess Hosting模型。強烈推薦你去看看我之前寫的ASP.NET Core InProcess以及ASP.NET Core中的 Kestrel Web服務器。這篇文章我將向大家詳細介紹下面幾個問題:
- 怎樣在ASP.NET Core中配置OutOfProcess Hosting?
- 什么是OutOfProcess Hosting?
- ASP.NET Core中OutOfProcess Hosting是如何工作的?
- 我們能否,不使用內置的Kestrel Web服務器來運行ASP.NET Core應用程序?
- 如果Kestrel本身可以作為web服務器使用,可以直接處理傳入的HTTP請求,那么我們為什么需要反向代理服務器呢?
在開始學習OutOfProcess Hosting之前,我們先回顧一下InProcess Hosting。
ASP.NET Core InProcess Hosting
在前面的文章中,已經了解到,為了配置InProcess Hosting,我們需要在項目文件中加入下面的代碼:
在ASP.NET Core的InProcess Hosting模型下,我們的應用程序是托管在IIS工作進程下的(也就是w3wp.exe,如果是使用IIS的話,如果使用的是IIS Express那么工作進程就是iisexpress.exe).你需要牢記的一點就是:在InProcess 模型下,我們只有一個Web服務器,也就是IIS 服務器。
怎樣在ASP.NET Core中配置OutOfProcess Hosting?
我們可以有兩種方式,來配置OutOfProcess Hosting
方式一:
在項目文件下,添加一個AspNetCoreHostingModel節點,值填寫OutOfProcess,:
方式二:
默認的Hosting方式就是OutOfProcess hosting,這也就意味着,你去掉AspNetCoreHostingModel節點,默認就是OutOfProcess Hosting了。
在ASP.NET Core中OutOfProcess Hosting
在OutOfProcess Hosting模型中,有兩種Web服務器:
- 內置的web服務器就是Kestrel
- 另外的外部服務器就是IIS、Apache、以及Nginx
您需要記住的最重要的一點是,取決於您如何使用OutOfProcess托管模型運行應用程序,外部web服務器可能會被使用,也可能不會被使用。
我們已經知道Kestrel web服務器是一個跨平台的web服務器,並且是嵌入到ASP.NET Core的應用程序中的。所以當你使用OutOfProcess 托管模型的時候,Kestrel可能有以下幾種方式使用:
方式一:
我們可以使用Kestrel Web服務器作為面向internet的Web服務器,它將直接處理傳入的HTTP請求。在這個場景中,只有Kestrel服務器被使用了,也就是外部服務器沒有被使用。所以當我們使用.NET Core CLI運行ASP.NET Core應用程序的時候,僅僅只有Kestrel服務器被使用了,用來處理HTTP請求。
方式二:
Kestrel Web服務器還可以與反向代理服務器(如IIS、Apache或Nginx)組合使用。那么你肯定有這樣的疑問:如果Kestrel本身可以作為web服務器使用,可以直接處理傳入的HTTP請求,那么我們為什么需要反向代理服務器呢?
這是因為反向代理服務器提供了一個額外的配置和安全層,這是Kestrel服務器無法提供的。同樣反向代理服務器,還維護着負載均衡。所以使用Kestrel服務器和反向代理服務器是一個很好的選擇。
因此,當我們使用Kestrel服務器和反向代理服務器時,反向代理服務器將接收來自客戶機的傳入HTTP請求,然后將該請求轉發到Kestrel服務器進行處理。一旦Kestrel服務器處理了該請求,它就會將響應發送回反向代理服務器,然后反向代理服務器通過internet將響應發送回被請求的客戶機,如下圖所示。
在后面的文章中,我將介紹我們怎么把ASP.NET Core應用程序發布到IIS,並且把IIS作為一個反向代理服務器。
當我們直接,在Visual Studio中運行程序的時候,Visual Studio,默認使用的是IIS Express。現在我們可以改變項目文件:
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
由於我們已經配置了進程外托管模型,現在IIS Express充當反向代理服務器,而Kestrel充當內部web服務器。
現在,IIS Express接收傳入的HTTP請求,然后將其轉發到Kestrel Web服務器進行處理。Kestrel Web服務器處理請求並將響應發送回IIS Express,而IIS Express又將響應發送回客戶機,即瀏覽器。
現在運行應用程序,您將看到工作進程為dotnet。因此,當您使用Out of Process Hosting模型時,Kestrel Web服務器將托管應用程序並處理請求,而不管您是否使用反向代理服務器。
還有一個很重要的需要記住:當你使用.NET Core CLI運行程序的時候,然后在默認情況下,它會忽略你在應用程序的項目文件中指定的主機設置,即csproj文件。在這種情況下,AspNetCoreHostingModel元素的值將被忽略。
.NET Core CLI總是使用OutOfProcess托管模型,並且Kestrel是web服務器,它將會托管ASP.NET Core應用程序,並且處理HTTP請求。
我們可以不使用內置的Kestrel服務器運行ASP.NET Core應用程序么?
答案是肯定可以的,當我們使用InProcess hosting模型的時候,應用程序是托管在IIS進程中的也就是w3wp.exe或者iisexpress.exe中。這也就是意味着,在InProcess模型中,我們是沒有使用Kestrel服務器的。
在下面的文章中,我將帶領大家學習ASP.NET Core中的 launchSetting.json文件。這篇文章中,我已經詳細介紹了OutOfProcess 托管模型,希望能幫到你。