在生产中实例化ASP.NET Core应用程序
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中进行检查:
所以它与使用命令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
方法中看到的所有方法都只会向管道添加额外的逻辑,如身份validation,静态内容服务,配置路由等。
我在这里要注意,为了使用某些function,我们必须首先将它们添加到我们的程序中,这将在ConfigureServices()
方法中完成,该方法在ConfigureServices()
方法之前运行。
这里重要的方法是Run()
,它阻塞调用线程(调用Main
方法的线程)。 所以Main
方法永远不会完成,否则会退出程序。 但我们的WebHost
正在后台运行,并将响应HTTP请求。
因此,要结束, Main
方法将在应用程序启动期间仅运行一次,并创建和配置WebHost
以提供HTTP请求。 无需为每个请求运行Main
方法或创建新的WebHost
。
这些是一些基础知识,如果你想了解更多,你应该阅读Microsoft Docs。 那里有许多有用的信息。
经过大量的学习和实验,我发现我的答案的关键点如下: Program.cs
和Startup.cs
仅在第一次发出Http请求时运行。 这是第一次配置Kestrel
并告知它任何后续请求(例如路由)必须知道的一切。
说实话,我不知道应用程序如何区分第一个请求和其他请求 ,但我上面描述的内容肯定发生在开发和生产中。
- 如何在asp.net核心中获取项目的根目录。 Directory.GetCurrentDirectory()似乎无法在mac上正常工作
- 虽然存在依赖关系和使用,但找不到类型或命名空间名称“Ping”
- 如何在ASP.NET Core 1.0中配置身份validation
- Linux上的.net核心应用程序目标.net框架4.5.2
- vNextdependency injection通用接口
- .NET核心entity framework存储过程
- Http错误的自定义错误页面404.13 ASP.NET Core MVC
- 如何在控制器中获取数据库上下文
- .net核心dependency injection是否支持Lazy