了解 ASP.NET 核心与 Apache

Understanding ASP.NET Core with Apache

在 IIS 中,我们有一个 aspnet_isapi 扩展来处理请求,然后它生成一个进程 w3wp.exe,w3wp.exe 然后加载并启动 CLR,然后 CLR 完成它的工作。

现在,Kestrel 是在 Main() 方法中配置的,所以首先应该执行 Main(),那么谁来启动 Core CLR?是 windows 的 IIS 和 Linux 的 Apache 吗? IIS 和 Apache 知道如何搜索和启动 Core CLR 吗?

据我所知,当一个.NET应用程序在那个时候执行时,控制权将转到操作系统,OS创建一个进程来加载CLR。

操作系统用于加载 CLR 的程序称为运行时宿主,根据应用程序类型(桌面应用程序或基于 Web 的应用程序)的不同而有所不同,即

桌面应用程序的运行时宿主是一个名为 CorbinToRuntime 的 API 函数。

基于 Web 的应用程序的运行时主机是 ASP.NET 工作进程 (aspnet-wp.exe)。

所以,怎么可能先执行 Main() 方法,然后执行 CLR,我无法消化它,请帮助。

忘记你所知道的关于 IIS 的一切。

对于 Apache 或 nginx,只需 运行 您的 ASP.NET 核心控制台应用程序(初始化核心 CLR)在本地端口(例如 http://localhost:5000),然后设置反向将外部流量转发到该端口的代理规则。

That's roughly what Microsoft documented in this article

Such reverse proxy setup is common, as other web stacks (Node.js, Python, Go) are using the same approach.

由于此特定设置,Linux 通过分析 COFF 信封(dotnet 可执行文件,或您自己的可执行文件以进行自包含部署)来启动您的 .NET Core 控制台应用程序以定位本机条目(不是您管理的 Main)。

Apache/nginx is not involved in anyway.

调用此条目会触发 CoreCLR 初始化,进而加载和管理您的托管程序集 Main

You might find articles like this helpful.