1.2 ASP.NET 核心概念


文档摘要

1.2 ASP.NET 核心概念 1.2 ASP.NET 核心概念 1.2.1 跨平台与模块化 概念详解: 与传统的 ASP.NET Framework 不同,ASP.NET Core 从一开始就被设计为跨平台的。这意味着您可以在 Windows、macOS 和 Linux 等操作系统上开发和运行 ASP.NET Core 应用程序。这种跨平台能力极大地扩展了应用程序的部署范围,并降低了对特定操作系统的依赖。 同时,ASP.NET Core 采用了高度模块化的架构。它不再是一个庞大的、单一的框架,而是由一系列独立的 NuGet 包组成。您可以根据应用程序的需要,只引入必要的模块,从而减少应用程序的体积,提高性能,并降低安全风险。这种模块化设计也使得 ASP.

## 1.2 ASP.NET 核心概念 ## 1.2 ASP.NET 核心概念 ### 1.2.1 跨平台与模块化 **概念详解:** 与传统的 ASP.NET Framework 不同,ASP.NET Core 从一开始就被设计为跨平台的。这意味着您可以在 Windows、macOS 和 Linux 等操作系统上开发和运行 ASP.NET Core 应用程序。这种跨平台能力极大地扩展了应用程序的部署范围,并降低了对特定操作系统的依赖。 同时,ASP.NET Core 采用了高度模块化的架构。它不再是一个庞大的、单一的框架,而是由一系列独立的 NuGet 包组成。您可以根据应用程序的需要,只引入必要的模块,从而减少应用程序的体积,提高性能,并降低安全风险。这种模块化设计也使得 ASP.NET Core 更容易维护和升级。 **代码实践:** 创建一个 ASP.NET Core Web API 项目,您可以观察到其项目结构的精简和模块化。 1. **创建项目:** 使用 .NET CLI 或 Visual Studio 创建一个新的 ASP.NET Core Web API 项目。 ```bash dotnet new webapi -o MyWebApp cd MyWebApp ``` 2. **查看项目文件:** 打开项目文件夹,您会看到一个简洁的项目结构,主要包含: * `Program.cs`: 应用程序的入口点,负责配置和启动应用程序。 * `Startup.cs`: 配置应用程序服务和请求管道的核心文件。 * `Controllers` 文件夹: 存放 API 控制器的文件夹。 * `appsettings.json`: 应用程序的配置文件。 * `.csproj` 文件: 项目文件,其中列出了项目依赖的 NuGet 包。 3. **查看 `.csproj` 文件:** 打开 `.csproj` 文件,您会看到类似以下的依赖项: ```xml net8.0 enable enable true ``` 可以看到,项目只依赖了必要的 `Microsoft.AspNetCore.App` 元包(在隐式引用中)以及 `Swashbuckle.AspNetCore` 和 `Microsoft.AspNetCore.OpenAPI` 等特定功能的包。如果您需要其他功能,例如 Entity Framework Core,则需要显式添加相应的 NuGet 包。 **Graph TD 图示:** ```mermaid graph TD subgraph ASP.NET Core Framework A[核心运行时环境 (.NET Runtime)] --> B(基础类库 (Base Class Library)); B --> C[ASP.NET Core 基础模块 (Microsoft.AspNetCore.*)]; C --> D[MVC 模块 (Microsoft.AspNetCore.Mvc.*)]; C --> E[Razor Pages 模块 (Microsoft.AspNetCore.Mvc.RazorPages.*)]; C --> F[Web API 模块 (Microsoft.AspNetCore.Mvc.WebApiCompatShim.*)]; C --> G[SignalR 模块 (Microsoft.AspNetCore.SignalR.*)]; C --> H[Entity Framework Core (Microsoft.EntityFrameworkCore.*)]; C --> I[Identity (Microsoft.AspNetCore.Identity.*)]; style A fill:#f9f,stroke:#333,stroke-width:2px end subgraph 操作系统 (OS) J[Windows] K[macOS] L[Linux] end D -->|基于| C E -->|基于| C F -->|基于| C G -->|基于| C H -->|独立模块| B I -->|独立模块| C ASP.NET Core Framework -->|运行在| J ASP.NET Core Framework -->|运行在| K ASP.NET Core Framework -->|运行在| L style ASP.NET Core Framework fill:#ccf,stroke:#333,stroke-width:2px style 操作系统 (OS) fill:#eee,stroke:#333,stroke-width:2px direction LR classDef concept fill:#eef,stroke:#333,stroke-width:1px; class A,B,C,D,E,F,G,H,I concept; ``` **图示解释:** * ASP.NET Core 框架运行在 .NET Runtime 之上,并依赖于基础类库 (BCL)。 * ASP.NET Core 框架本身由一系列模块组成,例如 MVC、Razor Pages、Web API、SignalR、Entity Framework Core 和 Identity 等。 * 这些模块以 NuGet 包的形式独立存在,可以根据需要选择性地添加到项目中。 * ASP.NET Core 框架可以运行在 Windows、macOS 和 Linux 等不同的操作系统之上,体现了其跨平台特性。 ### 1.2.2 轻量级和高性能 **概念详解:** ASP.NET Core 被设计为轻量级和高性能的框架。它摒弃了传统 ASP.NET Framework 中一些不必要的组件和臃肿的设计,采用了精简的核心运行时和优化的请求处理管道。 * **Kestrel Web 服务器:** ASP.NET Core 默认使用 Kestrel 作为跨平台的、高性能的 Web 服务器。Kestrel 是一个基于事件驱动的异步服务器,专为 ASP.NET Core 应用程序优化。在生产环境中,Kestrel 通常会与反向代理服务器(如 IIS、Nginx 或 Apache)一起使用,以提供更全面的功能和安全性。 * **优化的请求管道:** ASP.NET Core 的请求管道采用了中间件 (Middleware) 的概念,允许开发者以模块化的方式处理 HTTP 请求。只有必要的中间件才会被添加到管道中,从而减少了请求处理的开销,提高了性能。 * **异步编程:** ASP.NET Core 充分利用了异步编程模型(async/await),使得应用程序能够高效地处理并发请求,避免线程阻塞,从而提高吞吐量和响应速度。 **代码实践:** 1. **性能测试:** 可以使用性能测试工具(如 Apache Benchmark, wrk, 或 Postman Collection Runner)来测试 ASP.NET Core Web API 的性能。 创建一个简单的 Web API 控制器: ```csharp using Microsoft.AspNetCore.Mvc; namespace MyWebApp.Controllers { [ApiController] [Route("[controller]")] public class PerformanceController : ControllerBase { [HttpGet("hello")] public IActionResult GetHello() { return Ok("Hello, ASP.NET Core!"); } } } ``` 使用 .NET CLI 运行应用程序: ```bash dotnet run ``` 使用 `ab` 工具进行性能测试 (示例,根据实际情况调整参数): ```bash ab -n 10000 -c 100 http://localhost:5000/performance/hello ``` 分析测试结果,关注请求的平均响应时间、每秒请求数 (RPS) 等指标。您可以对比 ASP.NET Core 与其他框架或技术的性能差异。 2. **中间件管道:** 在 `Startup.cs` 的 `Configure` 方法中,可以看到中间件管道的配置: ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // 中间件 1: HTTPS 重定向 app.UseRouting(); // 中间件 2: 路由 app.UseAuthorization(); // 中间件 3: 授权 app.UseEndpoints(endpoints => // 中间件 4: 终端路由 { endpoints.MapControllers(); // 映射控制器路由 }); } ``` 每个 `app.Use...` 方法都添加一个中间件到请求管道中。您可以根据需要添加或移除中间件,定制请求处理流程。 **Graph TD 图示:** ```mermaid graph TD subgraph 请求处理管道 A[HTTP 请求] --> B(Kestrel Web 服务器); B --> C{中间件 1}; C --> D{中间件 2}; D --> E{中间件 3}; E --> F{...}; F --> G{中间件 N}; G --> H[Endpoint (终结点)]; H --> I[HTTP 响应]; end subgraph 中间件示例 C -- 使用认证中间件 --> D D -- 使用路由中间件 --> E E -- 使用授权中间件 --> F F -- 使用自定义中间件 --> G end style 请求处理管道 fill:#fdd,stroke:#333,stroke-width:2px style 中间件示例 fill:#eee,stroke:#333,stroke-width:1px direction TB classDef process fill:#eef,stroke:#333,stroke-width:1px; class C,D,E,F,G process; ``` **图示解释:** * HTTP 请求首先到达 Kestrel Web 服务器。 * 请求被传递到一系列中间件进行处理,中间件按照在管道中注册的顺序依次执行。 * 每个中间件都可以检查和修改请求或响应,或者将请求传递给下一个中间件。 * 最终,请求到达终结点 (Endpoint),通常是 MVC 控制器或 Razor Page 处理器,生成 HTTP 响应。 * HTTP 响应沿着相反的管道路径返回,经过中间件的后处理,最终返回给客户端。 ### 1.2.3 依赖注入 (Dependency Injection) **概念详解:** 依赖注入 (DI) 是 ASP.NET Core 的核心特性之一,也是现代软件开发的重要设计模式。DI 是一种实现控制反转 (IoC) 的技术,它允许对象之间的依赖关系在外部进行配置,而不是在代码中硬编码。 * **Service Container (服务容器):** ASP.NET Core 内置了一个轻量级的服务容器,负责管理应用程序中组件的生命周期和依赖关系。 * **服务注册:** 开发者需要将应用程序中需要使用 DI 的服务注册到服务容器中。注册时可以指定服务的生命周期 (例如,Singleton, Scoped, Transient)。 * **依赖注入:** 当需要使用某个服务时,可以通过构造函数注入、属性注入或方法注入等方式,让服务容器自动将依赖的服务注入到组件中。 DI 带来了许多好处,包括: * **松耦合:** 组件之间的依赖关系被解耦,提高了代码的可维护性和可测试性。 * **可测试性:** 更容易进行单元测试,因为可以轻松地替换依赖的服务。 * **可重用性:** 服务可以被多个组件重用。 * **可扩展性:** 更容易扩展和修改应用程序,因为组件之间的依赖关系是可配置的。 **代码实践:** 1. **注册服务:** 在 `Startup.cs` 的 `ConfigureServices` 方法中注册服务。 定义一个简单的服务接口和实现类: ```csharp public interface IMessageService { string GetMessage(); } public class DefaultMessageService : IMessageService { public string GetMessage() { return "Hello from Dependency Injection!"; } } ``` 在 `Startup.cs` 中注册服务 (Transient 生命周期): ```csharp public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddTransient(); // 注册服务 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyWebApp", Version = "v1" }); }); } ``` 2. **注入服务:** 在控制器中使用构造函数注入来获取 `IMessageService` 的实例。 ```csharp using Microsoft.AspNetCore.Mvc; namespace MyWebApp.Controllers { [ApiController] [Route("[controller]")] public class DIController : ControllerBase { private readonly IMessageService _messageService; public DIController(IMessageService messageService) // 构造函数注入 { _messageService = messageService; } [HttpGet("message")] public IActionResult GetMessage() { return Ok(_messageService.GetMessage()); } } } ``` 当请求 `/di/message` 接口时,ASP.NET Core 的 DI 容器会自动创建 `DefaultMessageService` 的实例,并将其注入到 `DIController` 的构造函数中。 **Graph TD 图示:** ```mermaid graph TD subgraph 服务容器 (Service Container) A[IServiceCollection] --> B(ServiceProvider); B --> C[服务 A (Singleton)]; B --> D[服务 B (Scoped)]; B --> E[服务 C (Transient)]; end subgraph 组件 (Components) F[Controller] -->|依赖于| G[IMessageService]; H[Razor Page] -->|依赖于| I[IDataService]; J[Middleware] -->|依赖于| K[ILogger]; end F -->|通过构造函数注入| B H -->|通过属性注入| B J -->|通过方法注入| B G -->|由服务容器提供| B I -->|由服务容器提供| B K -->|由服务容器提供| B style 服务容器 (Service Container) fill:#cce,stroke:#333,stroke-width:2px style 组件 (Components) fill:#eee,stroke:#333,stroke-width:1px direction LR classDef service fill:#eef,stroke:#333,stroke-width:1px; class C,D,E service; ``` **图示解释:** * 服务容器 (Service Container) 负责注册和管理应用程序中的服务。 * `IServiceCollection` 用于注册服务,`ServiceProvider` 是服务容器的实现。 * 服务可以注册为不同的生命周期:Singleton (单例)、Scoped (作用域) 和 Transient (瞬态)。 * 组件 (例如 Controller, Razor Page, Middleware) 可以通过构造函数注入、属性注入或方法注入等方式从服务容器获取依赖的服务实例。 * 服务容器负责解析依赖关系,并自动创建和注入所需的依赖项。 ### 1.2.4 配置系统 (Configuration System) **概念详解:** ASP.NET Core 引入了灵活且可扩展的配置系统,用于管理应用程序的配置信息。配置信息可以来自多种来源,例如: * **appsettings.json 和 appsettings.{Environment}.json:** JSON 格式的配置文件,用于存储应用程序的默认配置和特定环境的配置。 * **用户机密 (User Secrets):** 用于在开发环境中安全地存储敏感信息,例如数据库连接字符串。 * **环境变量 (Environment Variables):** 操作系统级别的环境变量,可以用于配置生产环境。 * **命令行参数 (Command-line Arguments):** 启动应用程序时传递的命令行参数。 * **自定义配置提供程序 (Custom Configuration Providers):** 开发者可以自定义配置提供程序,从其他来源(例如数据库、远程配置中心)加载配置信息。 配置系统支持配置信息的层次结构和覆盖规则。后加载的配置源可以覆盖之前加载的配置源。 **代码实践:** 1. **读取配置:** 在 `Program.cs` 或 `Startup.cs` 中,可以通过 `IConfiguration` 接口访问配置信息。 在 `appsettings.json` 中添加配置项: ```json { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "MyConfig": { "Message": "Hello from Configuration!" } } ``` 在控制器中读取配置: ```csharp using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; namespace MyWebApp.Controllers { [ApiController] [Route("[controller]")] public class ConfigController : ControllerBase { private readonly IConfiguration _configuration; public ConfigController(IConfiguration configuration) // 构造函数注入 IConfiguration { _configuration = configuration; } [HttpGet("message")] public IActionResult GetMessageFromConfig() { var message = _configuration["MyConfig:Message"]; // 读取配置项 return Ok(message); } } } ``` 运行应用程序并访问 `/config/message` 接口,您将看到从配置文件中读取的消息 "Hello from Configuration!"。 2. **配置绑定:** 可以将配置信息绑定到强类型 C# 对象。 定义一个配置类: ```csharp public class MyConfigOptions { public string Message { get; set; } } ``` 在 `Startup.cs` 中配置绑定: ```csharp public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.Configure(Configuration.GetSection("MyConfig")); // 配置绑定 // ... } ``` 在控制器中注入配置选项: ```csharp using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; namespace MyWebApp.Controllers { [ApiController] [Route("[controller]")] public class ConfigOptionsController : ControllerBase { private readonly MyConfigOptions _configOptions; public ConfigOptionsController(IOptions configOptions) // 注入 IOptions { _configOptions = configOptions.Value; } [HttpGet("message")] public IActionResult GetMessageFromOptions() { return Ok(_configOptions.Message); } } } ``` 访问 `/configoptions/message` 接口,结果与之前相同。使用 `IOptions` 可以更方便地访问和管理配置信息。 **Graph TD 图示:** ```mermaid graph TD subgraph 配置源 (Configuration Sources) A[appsettings.json] B[appsettings.{Environment}.json] C[User Secrets] D[Environment Variables] E[Command-line Args] F[Custom Provider] end subgraph 配置系统 (Configuration System) G[ConfigurationBuilder] --> H[IConfigurationRoot]; H --> I[配置数据 (Key-Value pairs)]; end A --> G B --> G C --> G D --> G E --> G F --> G H -->|读取配置| J[应用程序代码]; style 配置源 (Configuration Sources) fill:#ffe,stroke:#333,stroke-width:2px style 配置系统 (Configuration System) fill:#eee,stroke:#333,stroke-width:1px direction TB classDef source fill:#eef,stroke:#333,stroke-width:1px; class A,B,C,D,E,F source; ``` **图示解释:** * ASP.NET Core 配置系统支持多种配置源,例如 JSON 文件、用户机密、环境变量、命令行参数和自定义配置提供程序。 * `ConfigurationBuilder` 用于构建配置对象 `IConfigurationRoot`。 * 配置源按照一定的顺序加载,后加载的配置源可以覆盖之前加载的配置源。 * `IConfigurationRoot` 提供了访问配置数据的接口,应用程序代码可以通过 `IConfiguration` 接口读取配置信息。 ### 1.2.5 托管模型 (Hosting Models) **概念详解:** ASP.NET Core 应用程序需要运行在宿主 (Host) 环境中。宿主负责应用程序的启动、生命周期管理、配置加载、日志记录等基础设施服务。ASP.NET Core 支持多种托管模型: * **Kestrel 自托管 (Self-Hosting with Kestrel):** 应用程序直接使用 Kestrel Web 服务器作为宿主。这是最常用的托管模型,特别适用于云环境和容器化部署。 * **IIS 托管 (Hosting with IIS):** 在 Windows 环境下,可以将 ASP.NET Core 应用程序托管在 IIS (Internet Information Services) 中。IIS 可以作为反向代理服务器,将请求转发给 Kestrel 运行的应用程序。 * **HTTP.sys 托管 (Hosting with HTTP.sys):** HTTP.sys 是 Windows 系统提供的 HTTP 服务器 API。ASP.NET Core 可以直接使用 HTTP.sys 作为宿主,适用于需要 Windows 身份验证等特定 IIS 功能的场景。 * **进程外托管 (Out-of-Process Hosting):** 应用程序运行在独立的进程中,与 Web 服务器进程分离。Kestrel 通常用于进程外托管,并通过反向代理服务器 (例如 IIS, Nginx, Apache) 进行通信。 * **进程内托管 (In-Process Hosting):** 应用程序与 IIS (或 HTTP.sys) 运行在同一个进程中。进程内托管可以提供更高的性能,但仅限于 Windows/IIS 或 Windows/HTTP.sys 环境。 **代码实践:** 1. **查看 Program.cs:** 在 `Program.cs` 文件中,可以看到宿主的配置代码: ```csharp using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); // 指定 Startup 类 }); } ``` `Host.CreateDefaultBuilder(args)` 创建了一个默认的宿主构建器,它会自动配置日志记录、配置加载等基础设施服务。`ConfigureWebHostDefaults` 用于配置 Web 宿主,例如指定 `Startup` 类、使用的 Web 服务器等。 2. **选择托管模型:** 默认情况下,ASP.NET Core 应用程序使用 Kestrel 自托管。如果要在 IIS 中托管,需要在 IIS 中配置应用程序,并确保安装了 .NET Core 运行时和 ASP.NET Core 模块。 可以通过修改 `.csproj` 文件或 `web.config` 文件来配置托管模型 (例如,进程内托管或进程外托管)。 **Graph TD 图示:** ```mermaid graph TD subgraph 托管环境 (Hosting Environment) A[操作系统 (OS)] --> B{宿主进程 (Host Process)}; B --> C[Web 服务器 (Web Server)]; B --> D[应用程序 (Application)]; end subgraph 托管模型示例 (Hosting Models) C1[Kestrel (自托管)] C2[IIS (进程外)] C3[IIS (进程内)] C4[HTTP.sys] end C1 --> C C2 --> C C3 --> C C4 --> C B -->|使用| C B -->|运行| D style 托管环境 (Hosting Environment) fill:#cdf,stroke:#333,stroke-width:2px style 托管模型示例 (Hosting Models) fill:#eee,stroke:#333,stroke-width:1px direction TB classDef model fill:#eef,stroke:#333,stroke-width:1px; class C1,C2,C3,C4 model; ``` **图示解释:** * ASP.NET Core 应用程序运行在托管环境 (Hosting Environment) 中。 * 托管环境由操作系统 (OS)、宿主进程 (Host Process)、Web 服务器 (Web Server) 和应用程序 (Application) 组成。 * 宿主进程负责启动和管理 Web 服务器和应用程序。 * ASP.NET Core 支持多种托管模型,例如 Kestrel 自托管、IIS 托管和 HTTP.sys 托管。 * 不同的托管模型适用于不同的部署场景和需求。 ### 1.2.6 总结 ASP.NET Core 的核心概念包括跨平台与模块化、轻量级和高性能、依赖注入、配置系统以及托管模型。这些概念共同构建了 ASP.NET Core 强大而灵活的基础,使其成为构建现代 Web 应用程序的理想选择。 * **跨平台与模块化** 提供了更广泛的部署选择和更精简的应用程序结构。 * **轻量级和高性能** 确保了应用程序的快速响应和高吞吐量。 * **依赖注入** 提高了代码的可维护性、可测试性和可扩展性。 * **配置系统** 提供了灵活且可扩展的配置管理方式。 * **托管模型** 提供了多种部署选项,适应不同的环境和需求。 理解并掌握这些核心概念是深入学习和应用 ASP.NET Core 的关键。通过代码实践和可视化图表,希望您对 ASP.NET Core 的核心概念有了更清晰的认识。在后续的章节中,我们将继续深入探讨 ASP.NET Core 的其他重要方面。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U