簡體   English   中英

在生產中實例化ASP.NET Core應用程序

[英]Instantiation of ASP.NET Core application in production

ASP.NET Core從Main方法開始執行, Main方法位於Program.cs文件中的Program class 這構建了一個Web托管環境,並告訴Web主機開始運行。 然后,有startup.cs文件。

在開發.NET Core Web應用程序時,我必須在本地構建它(例如,通過Ctrl-F5)。 這樣做時, Main方法正在運行。 每次我想打開我的Web應用程序時,鑒於IIS Express已經啟動,我只是編寫例如http:// localhost:65040 通過這樣做, Main方法不再運行 ,但一切正常(路由等..)。 所以, 我有以下問題

.NET Core如何知道在接收上述Http請求時該怎么做( http:// localhost:65040 )? 例如,它是如何實現路由的

app.UseMvc(routes =>
{
    app.UseMvcWithDefaultRoute();
})

Startup.cs中沒有再次運行? There is no need for that because IIS has already been informed?

如果上述想法是正確的,那么deployment究竟發生了什么? 然后我們的Http請求永遠不會觸發program.csstartup.cs 那么,遠程Web服務器以哪種方式被告知如何實現路由等?

無論您選擇ASP.Net核心應用程序(IIS還是通過Kestrel進行自托管),在宿主進程啟動期間,方法Program.Main()Startup.ConfigureServices()Startup.Configure()執行一次。

很明顯,當您使用Kestrel Web服務器啟動exe文件時,會執行Program.Main() 然而,在IIS中托管時是否實際調用它可能並不明顯。 實際上是這樣的。 當ASP.Net核心應用程序與IIS集成時,它通常由dotnet.exe運行程序執行(它也可以配置應用程序.exe文件的啟動)。 您可以在添加應用程序期間創建的web.config中進行檢查:

<configuration>
  <system.webServer>
    <!-- ... -->
    <aspNetCore processPath="dotnet" arguments=".\TestMvcApplication.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>

所以它與使用命令dotnet.exe TestMvcApplication.dll運行應用程序時基本相同。 在這種情況下執行Program.Main() ,后面是Startup方法。

如果沒有基本構建Web主機的Main()方法,ASP.Net Core應用程序就無法運行。

當您觸發后續查詢時,它們由同一主機應用程序處理(我的意思是這里的Windows進程相同)。 ASP.Net Core所需的所有配置(如路由,中間件,服務等)已經在此過程中連接。 這就是ASP.Net Core能夠處理請求的原因。

我希望這是你的問題的答案。 以下是一些有用的有用鏈接:

在ASP.NET Core中托管

使用IIS在Windows上托管ASP.NET Core

ASP.NET Core中的應用程序啟動

以下是從高級視圖運行程序時發生的情況:

首先,與任何其他.NET應用程序一樣,將調用Main方法,因為這是任何.NET應用程序的起點。

如果它是一個控制台應用程序,那么沒什么特別的,它只是運行代碼並退出程序。

但是對於Web應用程序,程序需要永遠運行並監聽傳入的HTTP請求。 那么我們怎么能對我們的應用程序說這個呢? 我們必須配置它。 與任何其他框架一樣,.NET Core有一些規則和約定,這是在.NET Core中構建Web應用程序的最簡單方法:

public class Program
{
    public static void Main()
    {
        new WebHostBuilder()
            .UseKestrel()
            .Configure(app =>
            {
                app.Run(async context => await context.Response.WriteAsync("Hello World!"));
            })
            .Build()
            .Run();
    }
}

那么這里發生的是OS在一個進程中運行Main方法(帶有一個處理線程)。 我們創建一個WebHostBuilder並將其配置為使用Kestrel作為webserver並發送回“Hello World!” 字符串到任何傳入的HTTP請求。 然后我們構建並運行我們的WebHostBuilder

Configure方法的作用是創建一個管道,這樣每個請求都將通過該管道的邏輯。 您在Configure方法中看到的所有方法都只會向管道添加額外的邏輯,如身份驗證,靜態內容服務,配置路由等。

我要在這里指出,對使用某些功能,我們必須將它們添加到我們的程序首先,將在完成ConfigureServices()方法,該方法之前運行Configure()方法。

這里重要的方法是Run() ,它阻塞調用線程(調用Main方法的線程)。 所以Main方法永遠不會完成,否則它會退出程序。 但我們的WebHost正在后台運行,並將響應HTTP請求。

因此,要進行總結, Main方法將在應用程序啟動期間僅運行一次,並創建和配置WebHost以提供HTTP請求。 無需為每個請求運行Main方法或創建新的WebHost

這些是一些基礎知識,如果你想了解更多,你應該閱讀Microsoft Docs。 那里有許多有用的信息。

經過大量的學習和實驗,我發現我的答案的關鍵點如下: Program.csStartup.cs 僅在第一次發出Http請求運行。 這是第一次配置Kestrel並告知它任何后續請求(例如路由)必須知道的一切。

說實話,我不知道應用程序如何區分第一個請求和其他請求 ,但我上面描述的內容肯定發生在開發和生產中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM