在开发.NET Core Web应用程序时,我必须在本地构建它(例如,通过Ctrl-F5).这样做时,Main方法正在运行.每次下次我想打开我的网络应用程序时,鉴于IIS Express已经启动,我只是在写http://localhost:65040.通过这样做,Main方法不再运行,但一切正常(路由等..).所以,我有以下问题:
.NET Core如何知道在接收上述Http请求(http://localhost:65040)后该怎么做?例如,它是如何实现路由的
app.UseMvc(routes => { app.UseMvcWithDefaultRoute(); })
在Startup.cs中没有再次运行?没有必要,因为IIS已经被告知了?
如果上述想法是正确的,那么部署中究竟发生了什么?然后我们的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(),后面是启动方法.
如果没有基本构建Web主机的Main()方法,ASP.Net Core应用程序就无法运行.
当您触发后续查询时,它们由同一主机应用程序处理(我的意思是这里的Windows进程相同). ASP.Net Core所需的所有配置(如路由,中间件,服务等)已经在此过程中连接.这就是ASP.Net Core能够处理请求的原因.
我希望这是你的问题的答案.以下是一些有用的有用链接:
Hosting in ASP.NET Core
Host ASP.NET Core on Windows with IIS
Application startup in ASP.NET Core