为什么我们在 ASP.NET 核心 Web 应用程序中有一个 Main() 方法(入口方法)?这种方法背后的原因是什么?



程序类包含一个公共静态void Main((方法。正如我们已经知道的,当我们在.net中创建控制台应用程序时,默认情况下。NET Framework使用Main Method创建一个类(即Program类(。我们还知道Main((方法是控制台应用程序执行的入口点。

现在的问题是,我们不是在创建控制台应用程序,而是在创建ASP。NET核心Web应用程序,但应用程序的创建类似于以Main方法为入口点的控制台应用程序。现在确实有意义了,我们可以配置应用程序管道和http请求管道。这是个好主意。

但是

这种体系结构方法背后还有其他具体的原因吗?

因为它是独立于平台的。

让我们这样说:他们可以创建一个带有特定入口点的DLL,并假设它总是由IIS通过ISAPI使用。但是,如果你不在IIS上运行它,不通过ISAPI,也不在Windows上运行它呢?

没错,你必须为每个网络服务器编程一些模块,以便它能够与你的DLL交互。另外,你还需要一个网络服务器。您可能还需要在发生更改时更新所有这些模块。然后你需要把它打包成一船不同的Linux发行版,再加上Mac和Windows,Android和iPhone等。

你为什么要这么做
因此它只在IIS上运行,而只在Windows上运行
坏主意
如今,大多数服务器运行Linux,大多数路由器和打印机也运行Linux,而大多数手机运行Android(又名Linux(或iOS,大多数电视操作系统都基于Linux。

如果你有一个主方法,你可以创建一个简单的控制台程序,用它可以在某个端口上启动一个web服务器,然后你可以用它将流量转发到(通过远程代理从NGINX/Apache(。或者,您可以通过HAproxy将SSL流量直接转发到该web服务器。

不需要IIS或ISAPI
如果您使用HAproxy,也不需要NGINX或Apache,因为您可以直接转发到kestrel
如果必须,它也可以在IIS中运行
也许这会使IIS集成稍微复杂一些,但它也会使集成到Linux/Unix/Mac环境(或任何其他环境,如手机(变得更容易。如前所述,现在大多数服务器都使用Linux。尤其是在Docker/LXC这样的容器中运行时。

除此之外,做任何其他事情都是极其愚蠢的
此外,这是一个无声的承认,他们(MS(在服务器空间丢失了,现在正在抢救需要抢救的东西(然而,最后一句话只是我的意见,不一定是事实(。

为什么需要它。

  • Point 1:我们没有从HttpApplication派生的Global.asax,它是入口点,也是配置设置ASP所需一切的主要组件。NET管道,即使您没有Global.asax,只要请求到达IIS,HttpApplication对象就会由中包含HttpRequestHttpResponse对象的框架创建。NET框架
    类似于中的。NET Core,要配置请求处理管道,无论如何,您需要调用Startup并为他提供所有必要的配置,这是在创建主机时由Main((完成的。

  • 第2点:ASP。NET Core是跨平台的,Kestrel是一个内置的服务器,它将在所有平台上托管应用程序,但在windows上除外,在windows上你可以托管进程中的应用程序,所以你需要配置Kestrel并告诉他托管该应用程序,这是通过UseKestrel()扩展方法完成的,同时IIS也可以用作反向代理,显然,在windows上,你永远不会使用反向代理,因为你可以选择在进程中托管,但如果你愿意,那么你可以使用UseIISIntegration()扩展方法进行配置,现在你可能会想,所有这些方法都在哪里,这些都是默认的,host.CreateDeafultBuilder()为你做所有这些。配置Logging、DI、Services、从appsettings.jsonappsettings.{environment}.json等源读取Configuration等都是在创建主机时完成的。

现在我想,你已经掌握了Main()背后的想法。

最新更新