ASP.NET Core 的工作原理
ASP.NET Core 应用本质上是一个 .NET 应用,其中包含一个 Program.cs 文件,用于设置所需的 Web 应用组件功能并使其运行。
最基本的 ASP.NET Core 应用的 Program.cs 文件:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
使用前面的代码:
- 已设置基本的 ASP.NET Core Web 应用程序,用于侦听根 URL(“/”)中的 HTTP GET 请求并使用“Hello World!”进行响应。
- 已初始化应用、配置单个路由并启动 Web 服务器。
Blazor
可以使用 Blazor 通过 ASP.NET Core 生成交互式 Web UI。 Blazor 是一个基于组件的 Web UI 框架,与 ASP.NET Core 集成,用于使用 HTML、CSS 和 C# 生成交互式 Web UI。
Counter.razor 文件中定义了可重复使用的 Blazor 组件,例如以下 Counter
组件:
@page "/counter"
@rendermode InteractiveServer
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
使用前面的代码:
- 创建了一个显示计数器的组件。
- @code 块包含使用 C# 的组件逻辑,其中包括递增计数器的方法。
- 每次点击按钮时,都会显示并更新计数器值。
- 组件方法允许在应用程序的不同部分中重复使用代码,并且可以灵活地在浏览器中或在 Blazor 应用中的服务器上运行。
可以通过添加 <Counter />
元素将 Counter
组件添加到应用中的任何网页。
@page "/"
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
<Counter />
API
ASP.NET Core 提供了用于使用 SignalR 生成 API、gRPC 服务和实时应用的框架,以便将数据更新即时推送到客户端。
基本精简 API:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/hello", () => "Hello, World!");
app.Run();
使用前面的代码:
- 已设置精简 API,用于侦听 /hello URL 中的 HTTP GET 请求并使用“Hello World!”进行响应。
- 使用
WebApplicationBuilder
配置应用。 MapGet
方法定义 GET 请求的路由和处理程序。
中间件
ASP.NET Core 使用中间件组件的管道来处理 HTTP 请求和响应。 这种模块化方法使你可以灵活地根据需要添加或删除中间件组件来自定义和扩展应用程序的功能。
中间件管道按顺序处理 HTTP 请求,确保在将请求传递到管道中的下一个组件之前,每个组件都可以执行其指定任务。
在 Program.cs 文件中添加内置中间件:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseHttpsRedirection();
app.UseRouting();
app.MapStaticAssets();
app.UseAuthentication();
app.UseAuthorization();
app.MapGet("/", () => "Hello World!");
app.Run();
在前面的代码中,添加了几个常用的中间件组件:
UseHttpsRedirection
:将 HTTP 请求重定向到 HTTPS。UseRouting
:启用路由以将请求映射到终结点。MapStaticAssets
:优化静态文件的发送,例如 HTML、CSS、JavaScript、图像和其他资产。UseAuthentication
:添加身份验证功能。UseAuthorization
:添加授权功能。app.MapGet
:这是一个简单的终结点,用于证明应用程序正在运行。
Dependency Injection
ASP.NET Core 具有对依赖项注入 (DI) 的内置支持,用于配置应用及其各种框架组件使用的服务。
例如,你可能希望使用 EntityFramework Core 之类的框架集中配置服务,而应用的其他部分则依赖于该框架来访问数据库。 可以使用依赖项注入将 EntityFramework Core 中的数据库上下文配置为服务,如下所示:
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
public DbSet<Product> Products { get; set; } = default!;
}
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
var app = builder.Build();
app.Run();
使用前面的代码:
- 将
DbContext
配置为使用依赖项注入的服务。 - 使用
WebApplicationBuilder
配置应用。 AddDbContext
方法向依赖项注入容器注册DbContext
。- 从配置中检索连接字符串并用于设置数据库上下文。
配置
ASP.NET Core 支持从各种源(例如 JSON 文件、环境变量和命令行参数)访问配置数据。
在 appsetting.json 文件中配置连接字符串:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"
}
}
在 Program.cs 文件中:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
var app = builder.Build();
app.Run();
使用前面的代码:
- 在 appsettings.json 文件中配置了连接字符串。
- 使用
WebApplicationBuilder
配置应用。 AddDbContext
方法向依赖项注入容器注册DbContext
。- 从配置中检索连接字符串并用于设置数据库上下文。
监视和诊断
ASP.NET Core 提供了一套全面的工具来监视和维护应用程序的运行状况和性能。 可以轻松地将这些功能作为中间件组件添加到应用程序,并将特定功能集成到项目中:
- 内置指标:ASP.NET Core 包含内置指标,用于跟踪应用程序性能的各个方面,例如请求率、响应时间和错误率。
- 灵活记录框架:内置了灵活的记录框架,并支持各种记录提供程序,包括控制台、调试和事件源。 这有助于捕获诊断和监视的详细日志。
- 跟踪:ASP.NET Core 支持分布式跟踪,这有助于跟踪跨不同服务和组件的请求流。 这对于诊断性能问题和了解应用程序不同部分之间的交互很有用。
- OpenTelemetry:ASP.NET Core 与 OpenTelemetry 集成,后者是云原生软件的开源可观测性框架。 OpenTelemetry 提供标准化 API 和检测来收集指标、日志和跟踪,使你能够更有效地监视和诊断应用程序。
- 运行状况检查:通过运行状况检查 API,可以监视应用程序的运行状况及其依赖项。 可以配置运行状况检查来报告各种组件(例如数据库、外部服务等)的状态。
- 诊断工具:ASP.NET Core 提供了各种诊断工具,例如 dotnet-trace、dotnet-dump 和 dotnet-gcdump,可帮助从应用程序收集和分析诊断数据。