ASP.NET Core基础补充01

2023-11-30 19:13:52 浏览数 (2)

ASP.NET Core (Main方法)

为什么ASP.NET Core采用Main方法?

需要记住的最重要的一点是,ASP.NET Core Web 应用程序最初作为控制台应用程序启动,Main() 方法是应用程序的入口点。因此,当我们执行ASP.NET Core Web应用程序时,首先它寻找 Main() 方法,这是执行开始的方法。然后,Main()方法将ASP.NET配置并启动它。此时,应用程序将成为ASP.NET Core Web应用程序。

如果进一步查看 Main() 方法的正文,则会发现它通过将命令行参数 args 作为参数传递来调用 CreateHostBuilder() 方法,如下图所示。

如下图所示,CreateHostBuilder() 方法返回实现 IHostBuilder 接口的对象。主机是一个静态类,可用于创建具有预配置默认值的 IHostBuilder 实例。CreateDefaultBuilder() 方法使用预配置的默认值创建主机构建器的新实例。在内部,它配置 Kestrel(用于ASP.NET的内部 Web 服务器)、IIS整合和其他配置。

在 Main()方法中,在此 IHostBuilder 对象上,调用 Build() 方法,该方法实际生成 Web 主机。然后,它将我们asp.net Web 主机中托管我们的Asp.net Core Web 应用程序。最后,在 Web 主机上,它称为 Run() 方法,该方法将实际运行 Web 应用程序,并开始侦听传入的 HTTP 请求。

启动类(Startup)

在设置主机时,还使用 IHostBuilder 类的 UseStartup() 扩展方法配置启动类。启动类有两种方法,如下图所示。

ConfigureServices() 方法配置应用程序所需的服务。Startup 类的Configure() 方法设置应用程序的请求处理管道。

CreateDefaultBuilder() 方法执行的任务是什么?

作为设置 Web 主机的一部分,CreateDefaultBuilder() 方法执行几项操作。其中一些如下:

  1. 设置 Web 服务器
  2. 从各种配置源加载主机和应用程序配置
  3. 配置日志记录

让我们讨论一下 CreateDefaultBuilder() 方法究竟对配置和设置 Web 服务器的作用。从托管的角度来看,一个ASP.NET Web 应用程序可以通过两种方式托管,即进程托管(InProcess)或进程外托管(OutOfProcess)。

注:当我们使用任何模板创建新 ASP.NET Core Web 应用程序时,默认情况下,使用InProcess 托管创建项目文件,该托管用于在 IIS 或 IIS Express 方案中托管应用程序。

如何验证是否在进程内?

为了验证上面的观点,打开项目属性。右键单击项目,然后从上下文菜单中选择属性选项。打开属性窗口后,选择"调试"并查看"托管模型"下拉列表的值,如下图所示。下拉列表包含三个值,即默认值(进程内)、进程内和进程外。

那么, 确认默认情况下它使用"进程中"托管模型。

如何在ASP.NET Core中配置InProcess托管?

要为 ASP.NET Core Web 应用程序配置 InProcess 托管,只有一个简单的设置**,只需将 元素添加到值为InProcess 的应用程序项目文件中。为此,只需从解决方案资源管理器右键单击应用程序,然后单击上下文菜单中的**"编辑项目文件"选项,如下代码所示。

image-20200923095508271

打开应用程序项目文件后,请对其进行修改,如下所示。此处添加元素并将其值设置为 InProcess。该节点也可以是OutOfProcess。

将托管模型设置为 InProcess 时会发生什么?

在 InProcess 托管的情况下(即当 CreateDefaultBuilder() 将值视为项目文件中 AspNetCoreHostingModel 元素的 InProcess 时),场景后面的 CreateDefaultBuilder() 方法内部调用 UseIIS() 方法。然后在 IIS 工作程序(即 iIS 的 w3wp.exe 和 Iisxpress.exe 的 IISExpress)中托管应用程序。

从性能的角度来看,InProcess 托管模型提供的请求吞吐量明显高于 OutOfProcess 托管模型。

在 IIS 中,将用于执行应用程序的进程名称是 w3wp**。同样,如果是 IIS Express,则进程名称将是 iisexpress。**

如何确定是否在InProcess进程下执行?

默认情况下, 如果您要运行该应用程序,那么您将在浏览器中看到以下 “Hello World!” 输出。

下面, 标记了输出“Hello World”位置的代码片段, 位于Startup类的Configure()方法中, 如下所示。

为了确认该应用程序是在InProcess进程下执行, 将"Hello World!" 修改为显示当前的进程名称, 通过调用: System.Diagnostics.Process.GetCurrentProcess().ProcessName获取当前的进程名称, 如下所示。

再次启动程序, 将在浏览器中显示以下信息, 如下所示。

这是因为默认情况下,Visual Studio 在运行应用程序时使用 IISExpress,如下图所示。

什么是 IIS Express?

IIS Express 是 IIS 的轻量级自包含版本。它针对 Web 应用程序开发进行了优化。您需要记住的最重要的一点是,我们仅在开发中使用 IIS Express,而不是生产。在生产中,我们通常使用 IIS。

为什么InProcess比OutOfProcess提供更好的性能?

在进程外**(OutOfProcess)**托管的情况下,有 2 台 Web 服务器

  1. 一个内部 Web 服务器
  2. 一个外部 Web 服务器。

内部 Web 服务器称为Kestrel,外部Web 服务器可以是IIS、Nginx****或 **Apache。**使用 InProcess 托管模型时,只有一个Web 服务器,即 IIS。因此,对于 InProcess 托管模型,我们在内部和外部 Web 服务器之间导航请求没有性能损失。这就是 InProcess 托管模型提供比 OutOfProcess 托管模型更高的请求吞吐量的原因。

InProcess Hosting(进程托管)

在上面的内容讲到, 我们可以通过右键选择属性, 更改应用程序的托管模型, 也可以通过右键编辑项目文件编辑****节点来设置, 如下所示。

在ASP.NET Core中,使用 Inprocess 托管模型,我们的应用程序将在 IIS 工作程序中托管。最重要的一点,需要记住的是,我们只有一个Web服务器,即 IIS服务器的情况下,InProcess托管,这将托管我们的应用程序,如下图所示。

什么是Kestrel Web 服务器?

ASP.NET Core是一个跨平台框架。 这意味着它支持在不同类型的操作系统(例如Windows,Linux或Mac)上开发和运行应用程序。

Kestrel是ASP.NET Core应用程序的跨平台Web服务器。 这意味着该服务器支持ASP.NET Core支持的所有平台和版本。 默认情况下,它包含在.NET Core应用程序中作为内部Web服务器。

Kestrel Web服务器通常用作边缘服务器,即面向Internet的Web服务器,它直接处理来自客户端的传入HTTP请求。 对于Kestrel Web服务器,用于承载和运行ASP.NET Core应用程序的进程名称是项目名称

如何使用 Kestrel Web 服务器运行应用程序?

在使用 Kestrel 服务器运行应用程序之前,让我们首先打开应用程序的属性文件夹中的launchSettings.json文件。打开launchSettings.json 文件后,默认情况下,您将找到以下代码。

在这里,您可以看到,我们有两个部分。 一种用于IIS Express(IIS服务器),另一种用于Kestrel服务器。 在Visual Studio中,您可以找到上述两个配置文件(IIS Express和FirstCoreWebApplication),如下所示。

如果选择 IIS Express,则它将使用 IIS 服务器,如果您选择 FirstCoreWeb 应用程序,则它将使用 Kestrel 服务器。

使用 IIS Express 运行应用程序:

如果您使用 IIS Express 运行应用程序,则它将使用启动设置.json 文件中提及的 URL 和端口号。若要证明这使用 IIS Express 运行应用程序,请参阅如下所示的输出(左边是配置文件、右边是浏览器输出)。

使用 Kestrel 服务器运行应用程序:

为了使用 Kestrel 服务器在 Visual Studio 中运行应用程序,首先,您需要修改你的启动方式为你当前的应用程序名称,如下所示。

选择 应用程序方式启动后,现在运行该应用程序。在这里,我们需要观察两件事。首先,它将启动命令提示符并使用 Kestrel 服务器托管应用程序,如下所示。在这里,您需要关注 URL 和端口号,并且应该是launchSettings.json文件的WebApplication4**(这里根据您实际的程序名称显示)**配置文件中提到的URL和端口号。

请参阅如下所示的输出(左边是配置文件、右边是浏览器输出以及打开的.NETCLI输出窗口)。

**注:**在这个的示例中,对于 IIS Express,端口号为 12166,辅助进程为 iisexpress,而对于 Kestrel 服务器,端口号为 5000,辅助进程名称为 WebApplication4 应用程序(它只不过是您的应用程序名称)。

如何使用 .NET Core CLI 运行 .NET Core应用程序?

我们还可以使用.NET Core CLI从命令行运行ASP.NET Core应用程序。 CLI代表命令行界面。

当我们使用.NET Core CLI运行ASP.NET Core应用程序时,.NET Core运行时将Kestrel用作Web服务器。 后面的文章中将详细讨论.NET Core CLI。

现在,让我们看看如何使用.NET Core CLI命令运行.NET Core应用程序。

首先, 按下windows r 输入cmd, 即可进入cmd窗口, 接下来输入, “dotnet --” , 按下enter后, 如下所示:

使用CLI(以上命令) 您可以使用new命令创建一个新项目,也可以使用build命令来构建该项目,或者可以使用publish命令来发布该项目。 可以使用CLI还原.net核心项目所需的依赖项和工具。

使用.NET Core CLI运行.NET Core应用程序:

在刚才的窗口当中, 我们使用cd命令, 转移到我们创建的项目路径下, 然后执行“ dotnet run”命令,如下图所示。

输入dotnet run 命令后,按 enter 键,然后 .NET Core CLI 生成并运行应用程序, 和上面选择应用程序启动的方式一致, cmd窗口会输出你的当前应用程序的URL, 但是与VisualStudo不同, 它并不会给你默认把这个地址用浏览器打开, 你可以选择在浏览器输入该地址, 则会显示相应内容。

什么是ASP.NET Core中的进程外托管(OutOfProcess)?

对于ASP.NET Core OutOfProcess托管模型,有两个Web服务器。

  1. 内部 Web 服务器,即Kestrel Web 服务器
  2. 以及可使用 IIS、Apache 和 Nginx 的外部 Web 服务器。

您需要记住的最重要的一点取决于您使用 OutOfProcess 托管模型运行应用程序,外部 Web 服务器可以使用,也可以不使用。

方法1:

我们可以使用 Kestrel Web 服务器作为面向 Internet 的 Web 服务器,它将直接处理传入的 HTTP 请求。在这种情况下,仅使用 Kestrel 服务器,而不会使用另一个服务器,即外部 Web 服务器。因此,当我们使用 .NET 核心 CLI 运行应用程序时,Kestrel 是唯一用于处理和处理传入 HTTP 请求的 Web 服务器,如下图所示。

如果要确认这一点,则打开命令提示符并运行应用程序,如下图所示。

在CMD窗口当中, 首先定位到你创建的Web应用程序的文件夹位置, 然后输入 dotnet run 命令。

注: dotnet cli中, 具备很多种命令行接口提供使用, 后面会详细讲解其中的作用。

键入dotnet run 命令并按 enter 键后,它将生成、托管和运行应用程序,如下图所示。

现在, 把上面红色标记的地址,输入至浏览器当中, 你将看到以下内容(如果你按照教程上方修改过输出):

因此,在这种情况下,Kestrel 是唯一将处理和处理传入 HTTP 请求的服务器。

方法2:

Kestrel Web 服务器也可以与反向代理服务器(如 IIS、Apache 或 Nginx)的组合一起使用。现在,你想到的问题是,如果Kestrel可以自己用作一个Web服务器,可以直接处理和处理传入的HTTP请求,那么为什么我们需要一个反向代理服务器?

这是因为反向代理服务器提供了 Kestrel 服务器无法提供的附加配置安全性层。它还保持负载平衡。因此,使用 Kestrel 服务器以及反向代理服务器是不错的选择。

因此,当我们使用 Kestrel Server 和反向代理服务器时,反向代理服务器将收到来自客户端的传入 HTTP 请求,然后将该请求转发到 Kestrel 服务器进行处理。一旦 Kestrel Server 处理该请求,然后它将响应发送回反向代理服务器,然后通过 Internet 将响应发送回请求的客户端,如下图所示。

当我们直接从 Visual Studio 运行应用程序时,默认情况下 Visual Studio 使用 IIS Express。现在更改 AspNetCoreHostingModel 元素值,如下所示的应用程序的项目文件。

OutofProcess

由于我们配置了进程外托管模型,现在 IIS Express 充当反向代理服务器,Kestrel 充当内部 Web 服务器。

现在,IIS Express 接收传入的 HTTP 请求,然后转发到 Kestrel Web 服务器进行处理。Kestrel Web 服务器处理请求并将响应发送回 IIS Express,而 IIS Express 又将响应发送回客户端,即发送到浏览器。

现在运行应用程序,您将将工作进程视为项目名称。因此,当您使用"进程外托管"模型时,Kestrel Web 服务器将托管应用程序并处理请求,无论您是否使用反向代理服务器。

使用.NET CLI启用ASP.NET Core应用程序时会发生什么?

当我们使用.NET Core CLI运行应用程序时,默认情况下,它会忽略您在应用程序的项目文件(即csproj文件)中指定的托管设置。 因此,在那种情况下,AspNetCoreHostingModel元素的值将被忽略。

.NET Core CLI始终使用OutOfProcess托管模型,而Kestrel是将托管ASP.NET Core应用程序并处理HTTP请求的Web服务器。

是否可以在不使用内置Kestrel Web服务器的情况下运行asp.net核心应用程序?

CLI运行应用程序时,默认情况下,它会忽略您在应用程序的项目文件(即csproj文件)中指定的托管设置。 因此,在那种情况下,AspNetCoreHostingModel元素的值将被忽略。

.NET Core CLI始终使用OutOfProcess托管模型,而Kestrel是将托管ASP.NET Core应用程序并处理HTTP请求的Web服务器。

是否可以在不使用内置Kestrel Web服务器的情况下运行asp.net核心应用程序?

是。 当我们使用InProcess Hosting模型时,则将应用程序托管在IIS工作进程中,即对于IIS为w3wp.exe,对于IIS Express为iisexpress.exe。 这意味着Kestrel Web服务器未与InProcess托管模型一起使用。

0 人点赞