繁体   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