[英]How to WebDeploy an ASP.NET Core application in “Production” environment?
[英]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.cs
和startup.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能夠處理請求的原因。
我希望這是你的問題的答案。 以下是一些有用的有用鏈接:
以下是從高級視圖運行程序時發生的情況:
首先,與任何其他.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.cs
和Startup.cs
僅在第一次發出Http請求時運行。 這是第一次配置Kestrel
並告知它任何后續請求(例如路由)必須知道的一切。
說實話,我不知道應用程序如何區分第一個請求和其他請求 ,但我上面描述的內容肯定發生在開發和生產中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.