![](/img/trans.png)
[英]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.