1. 课程导入与工程全景

在开始写第一行接口代码之前,先把“我们到底在用什么、为什么用它、怎么选版本、怎么建项目”这几件事理清楚,后面的 29 章才不会走弯路。本课程面向的是用 C# 构建 HTTP 服务端接口的工程实践,核心平台是 ASP.NET Core,核心产物是 Web API。

一、ASP.NET Core Web API 的定位

ASP.NET Core 是 .NET 平台上用于构建 Web 应用的统一框架,它同时承载了 MVC、Razor Pages、Blazor、SignalR、gRPC 以及 Web API 等多种应用形态。Web API 并不是一个独立的框架,而是“用 ASP.NET Core 承载、以数据交换为主要目的、通常返回 JSON 而非 HTML 页面”的一类应用。它的典型特征是:路由映射到控制器或端点方法,请求体与响应体通过内容协商序列化,认证授权以中间件形式插入请求管道。

理解这一点很关键:Web API 与 MVC 共享同一套路由、模型绑定、过滤器、依赖注入和中间件体系。区别主要在于 MVC 默认以“返回视图”为终点,而 Web API 默认以“返回数据”为终点。因此本课程讲的路由、DI、中间件、过滤器等知识,同样适用于 MVC 项目,只是关注点不同。

二、与 MVC、Minimal API 的关系

ASP.NET Core 提供两种编写 HTTP 端点的风格。第一种是控制器风格(Controller-based),用 [ApiController] 标注的类承载一组相关端点,适合接口数量多、需要分组、需要过滤器与约定统一处理的场景。第二种是 Minimal API,直接在 Program.cs 中用 app.MapGet、app.MapPost 等扩展方法注册端点,代码量小、启动快,适合微服务、小型服务或原型验证。

两者不是替代关系,而是同一请求管道上的两种组织方式。Minimal API 同样支持依赖注入、模型绑定、过滤器(端点过滤器)和 OpenAPI。实际工程中常见的做法是:对外暴露的少量端点用 Minimal API,业务域复杂、需要统一约定的模块用控制器。本课程以控制器风格为主线,因为它更能体现分层、约定和可维护性;在涉及轻量场景时会对比 Minimal API 的写法。

ASP.NET Core 请求管道与端点风格 HTTP 请求 Kestrel 服务器 监听端口 / TLS 中间件管道 认证 / 日志 / 异常 / CORS 路由匹配 Endpoint Routing 按模板选择端点 控制器风格 Controller-based [ApiController] + 继承 ControllerBase 按资源分组,统一过滤器与约定 适合中大型业务 API Minimal API app.MapGet / MapPost 直接注册 代码少、启动快、端点过滤器 适合微服务与轻量服务 共享能力:依赖注入 · 模型绑定与验证 · 内容协商(JSON) · 过滤器 · OpenAPI · 认证授权 两种风格运行在同一条中间件管道之上,可混合使用 响应沿管道反向返回:端点结果 → 中间件后置逻辑 → Kestrel → 客户端

三、.NET 运行时与 SDK 版本选择

初学者最容易混淆的是“运行时”和“SDK”。运行时(Runtime)只负责执行已编译好的程序,包含 Microsoft.NETCore.App 与 Microsoft.AspNetCore.App 两部分;SDK 则在运行时之上额外提供编译器、MSBuild、模板引擎和 CLI 工具。结论很直接:开发机装 SDK,生产服务器装运行时。如果服务器上只部署不编译,装 ASP.NET Core Runtime 即可,体积更小、攻击面更少。

版本选择遵循两条规则。第一,优先选 LTS(长期支持)版本,例如 .NET 8 是 LTS,支持周期长,适合生产;STS(标准期限支持)版本如 .NET 9 生命周期较短,适合尝鲜。第二,同一解决方案内所有项目应统一目标框架,避免混用导致还原失败。目标框架写在项目文件的 <TargetFramework> 中,例如 net8.0。可用以下命令确认本机环境:

dotnet --list-sdks
dotnet --list-runtimes
dotnet --info

若输出中同时存在多个 SDK,global.json 可以锁定项目使用的 SDK 版本,避免团队协作时因版本漂移产生差异:

{
  "sdk": {
    "version": "8.0.400",
    "rollForward": "latestFeature"
  }
}

四、项目模板对比与创建

执行 dotnet new list 可以看到内置模板。与 Web API 相关的常见模板有三类:webapi(控制器风格,含 WeatherForecast 示例)、webapi --use-minimal-apis(Minimal API 风格)、mvc(含视图的 MVC 应用)。此外 web 是空 Web 模板,只含最简管道,适合从零搭建。

模板端点风格默认包含适用场景
webapi控制器Controllers、Swagger、WeatherForecast业务 API 主线
webapi --use-minimal-apisMinimalProgram.cs 内联端点、Swagger微服务、原型
web无仅空管道自定义架构
mvc控制器 + 视图Views、Razor、静态文件服务端渲染站点

创建第一个可运行 API 的完整过程如下。先建解决方案目录,再建项目并加入解决方案,最后运行:

dotnet new webapi -n FirstApi -o src/FirstApi
dotnet new sln -n CourseDemo
dotnet sln CourseDemo.sln add src/FirstApi/FirstApi.csproj
dotnet run --project src/FirstApi

运行后控制台会打印监听地址,例如 Now listening on: https://localhost:7198。此时打开浏览器访问 https://localhost:7198/swagger,可以看到自动生成的接口文档;访问 /weatherforecast 会返回一段 JSON 数组。判断“第一个 API 是否跑通”的标准有三条:控制台无异常堆栈、Swagger 页面能列出端点、直接请求端点返回 200 与合法 JSON。

首次运行若提示证书不受信任,执行 dotnet dev-certs https --trust 并确认系统弹窗即可。开发环境使用 HTTPS 重定向中间件,HTTP 请求会被 307 跳转到 HTTPS,这是正常行为。

五、调试与观察点

在 Visual Studio 或 VS Code 中按 F5 启动调试,断点建议下在控制器方法入口,观察 Request.Path、Request.Method 与模型绑定后的参数值。修改 launchSettings.json 中的 applicationUrl 可以更换端口;ASPNETCORE_ENVIRONMENT 决定加载 appsettings.Development.json 还是 appsettings.json,这是后续配置章节的基础。日志默认输出到控制台,级别由 Logging:LogLevel:Default 控制,调试时把它设为 Information 就能看到每个请求的进入与完成记录。

不要在生产环境保留 Swagger UI 的公开访问,也不要把 ASPNETCORE_ENVIRONMENT 设为 Development 部署到公网。这两点在后续安全与部署章节会展开。