ASP.NET Core基础一

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

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() 方法,如下图所示。

image.png

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

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

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

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

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

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

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

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

image.png

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

如何在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!” 输出。

image.png

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

image.png

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

image.png

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

image.png

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

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

为什么InProcess比OutOfProcess提供更好的性能?
在进程外(OutOfProcess)托管的情况下,有 2 台 Web 服务器

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

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

image.png

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

image.png

什么是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 文件后,默认情况下,您将找到以下代码。
image.png

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

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

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

image.png

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

image.png

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

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

注:在这个的示例中,对于 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后, 如下所示:

image.png

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

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

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

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

什么是ASP.NET Core中的进程外托管(OutOfProcess)?
对于ASP.NET Core OutOfProcess托管模型,有两个Web服务器。

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

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

image.png

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

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

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

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

image.png

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

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

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

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

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

image.png

当我们直接从 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托管模型一起使用。

目录
相关文章
|
1月前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
1月前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
1月前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
4月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
75 0
|
4月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
38 0
|
4月前
|
开发框架 JavaScript .NET
ASP.NET Core的超级大BUG
ASP.NET Core的超级大BUG
44 0
|
16天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
22 0
|
1月前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
26 4
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
79 0