ASP.NET Core
ASP.NET Core 启动流程
ASP.NET Core Web 应用程序最初作为控制台应用程序启动,Main() 方法是应用程序的入口点。因此,当我们执行ASP.NET Core Web应用程序时,首先它寻找 Main() 方法,这是执行开始的方法。然后,Main()方法将ASP.NET配置并启动它。此时,应用程序将成为ASP.NET Core Web应用程序。
在.Net5中,用户配置在startup.cs中,.Net6之后所有都在program.cs中了。
ConfigureServices() 方法配置应用程序所需的服务。Startup 类的Configure() 方法设置应用程序的请求处理管道。
Program.cs 是启动服务,加载配置的。
CreateDefaultBuilder() 方法执行的任务是什么?
作为设置 Web 主机的一部分,CreateDefaultBuilder() 方法执行几项操作。其中一些如下:
- 设置 Web 服务器
- 从各种配置源加载主机和应用程序配置
- 配置日志记录
ASP.NET Core 托管模型
-
InProcess(进程内托管)
- 它只有一个服务器,IIS或者内置服务器kestrel
-
OutOfProcess(进程外托管)
- 有两个服务器,一个是内部服务器(kestrel),一个外部服务器(IIS,Nginx)。
IIS 和 kestrel的区别:
1. kestrel是一个轻量级的服务器版本,针对我们开发的时候优化过的一个版本,**在实际生产中,往往使用IIS服务器**
IIS(Internet Information Services)和 Kestrel 是用于托管 ASP.NET Core 应用程序的两种不同的 Web 服务器。
-
IIS(Internet Information Services):
- IIS 是 Microsoft 提供的用于 Windows 操作系统的 Web 服务器软件。
- IIS 具有强大的功能和广泛的配置选项,可以用于托管多种类型的应用程序,包括 ASP.NET、Classic ASP、PHP 等。
- IIS 支持多个协议(如 HTTP、HTTPS、FTP 等)和各种身份验证和授权机制。
- IIS 可以与其他 Microsoft 产品和服务(如 Active Directory、SQL Server 等)进行集成,提供更多的功能和扩展性。
- IIS 可以作为前端代理,将请求转发给其他后端服务器(如 Kestrel)进行处理。
-
Kestrel:
- Kestrel 是 ASP.NET Core 的跨平台、轻量级的 Web 服务器,使用 C# 编写。
- Kestrel 的设计目标是高性能和可扩展性,在处理大量并发请求时表现出色。
- Kestrel 可以作为主机独立运行,也可以与其他反向代理服务器(如 Nginx、Apache 等)配合使用。
- Kestrel 默认情况下不支持一些高级功能(如 HTTPS、虚拟主机等),但可以通过与其他服务器(如 Nginx)结合使用来实现这些功能。
主要区别:
- IIS 是 Microsoft 提供的全功能 Web 服务器,适用于 Windows 操作系统,支持多种应用程序类型和功能,具有广泛的配置选项和集成能力。
- Kestrel 是 ASP.NET Core 的内置 Web 服务器,跨平台运行,专注于高性能和可扩展性,适用于轻量级应用程序。
- 在生产环境中,通常将 IIS 作为反向代理服务器,将请求转发给 Kestrel 进行处理,以充分发挥它们各自的优势。
值得注意的是,ASP.NET Core 应用程序可以在 IIS 上托管,同时使用 IIS 作为反向代理服务器和 Kestrel 作为应用程序的主机。这种配置结合了 IIS 的功能和 Kestrel 的性能优势。
ASP.NET Core 启动配置
打开launchSettings.json 文件后,默认情况下,您将找到以下代码。
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:1118",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication4": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
如果选择 IIS Express,则它将使用 IIS 服务器,如果您选择 WebApplication4 应用程序,则它将使用 Kestrel 服务器。
launchSettings.json文件的 commandName 属性的值可以是以下任何一个:
- IISExpress
- IIS
- Project
launchSettings.json文件的commandName属性值以及应用程序项目文件中的AspNetCoreHostingModel元素值将确定将要使用和处理传入HTTP请求的内部和外部Web服务器(反向代理服务器)。 为了更好地理解,请看下图。
ASP.NET Core StartUp类
.Net 6 之前 ASP.NET Core必须包含Startup类。它就像 Global.asax 文件,我们传统的 .NET 应用程序。如名称建议的那样,在应用程序启动时首先执行它。在程序类的Main方法中配置主机时,可以使用UseStartup()扩展方法配置启动类。请查看下面的程序类,并重点介绍 WebBuilder.UseStartup() 方法。
如上面在代码中看到的,Startup类包含两个公共方法:ConfigureServices和Configure。 Startup类必须包含Configure方法,并且可以选择包含ConfigureService方法。
ConfigureServices()方法
依赖注入模式在ASP.NET Core体系结构中大量使用。它包括内置的IoC容器,以使用构造函数提供相关的对象。
在ConfigureServices方法中,可以使用内置IoC容器注册依赖类。
注册依赖类后,可以在应用程序中的任何位置使用它。您只需要在要使用它的类的构造函数的参数中包含它即可。 IoC容器将自动注入它。
ASP.NET Core将依赖类称为服务。因此,每当您阅读“服务”,然后将其理解为将在其他一些类中使用的类。
ConfigureServices方法包含IServiceCollection参数,以将服务注册到IoC容器。
例如,如果要将RazorPages服务或MVC服务添加到asp.net核心应用程序,则需要将这些服务添加到该方法接受的参数中,如下图所示。
Configure()方法
在Configure方法中,我们可以使用内置IoC容器提供的IApplicationBuilder实例为asp.net核心应用程序配置应用程序请求管道。
ASP.NET Core引入了中间件组件来定义请求管道,该管道将在每个请求上执行。 您仅包括应用程序所需的那些中间件组件,从而提高了应用程序的性能。
带有Empty模板的ASP.NET Core应用程序的默认配置方法包括以下三个中间件,如下图所示。
访问配置的默认顺序是什么?
为同一键读取各种配置源的默认顺序如下:
- appsettings.json,
- appsettings.{Environment}.json
- 用户设置
- 环境变量
- 命令行参数
如您所见,Program类的Main()方法调用CreateHostBuilder()方法。 然后,CreateHostBuilder()方法在Host类上调用CreateDefaultBuilder()方法。
此CreateDefaultBuilder()方法是设置读取所有配置源的默认顺序的方法。
如果需要,还可以更改此默认顺序,或者即使您愿意,也可以添加自己的自定义配置源以及现有的配置源。
ASP.NET Core 中间件
什么是ASP.NET Core Middleware?
ASP.NET Core中间件组件是被组装到应用程序管道中以处理HTTP请求和响应的软件组件(从技术上来说,组件只是C#类)。
ASP.NET Core应用程序中的每个中间件组件都执行以下任务。
- 选择是否将 HTTP 请求传递给管道中的下一个组件。这可以通过在中间件中调用下一个 next() 方法实现。
- 可以在管道中的下一个组件之前和之后执行工作。
在ASP.NET Core中,已经有很多内置的中间件组件可供使用,您可以直接使用它们。 如果需要,还可以在ASP.NET Core应用程序中创建自己的中间件组件。
您需要牢记的最重要的一点是,在ASP.NET Core中,给定的中间件组件应仅具有特定目的,即单一职责。
在ASP.NET Core应用程序中使用中间件组件的一些示例如下:
- 用于验证用户身份的中间件
- 中间件可用于记录请求和响应
- 用于处理错误的中间件
- 用于处理静态文件,例如图像,Javascript或CSS文件的中间件
- 用于在访问特定资源时授权用户的中间件
中间件组件是我们通常用于在ASP.NET Core应用程序中建立请求处理管道的组件。
如果您使用过.NET Framework的早期版本,那么您可能知道,我们使用HTTP处理程序和HTTP模块来设置请求处理管道。 正是此管道将确定如何处理HTTP请求和响应。