c# 开发web api 教程

来源:这里教程网 时间:2026-02-21 17:42:38 作者:

直接用 ASP.NET Core 创建 Web API,别从“新建项目→选模板→F5运行”开始讲起——那不是教程,是向导。你真正卡住的地方,通常是路由没生效、模型绑定失败、跨域被拦、或者返回的 JSON 字段名不对。

Controller 继承
ControllerBase
而不是
Controller

如果你只需要返回 JSON(比如前端调用的纯 API),

ControllerBase
更干净:它不带
View()
PartialView()
这些 MVC 专属方法,编译期就能防误用。

常见错误:手抖继承了

Controller
,结果 IDE 提示
ViewBag
可用,但你根本不需要——这会悄悄增加不必要的依赖和内存开销。

API 控制器一律用
[ApiController]
特性标记
ControllerBase
默认启用模型验证失败自动返回
400 Bad Request
,不用自己写
if (!ModelState.IsValid) return BadRequest();
如果后续真要混用 View(比如管理后台页面),再改继承关系,而不是一开始贪方便选错基类

[FromQuery]
[FromBody]
[FromRoute]
必须显式声明

ASP.NET Core 不再默认猜测参数来源。不加特性,

string id
会被当成
[FromQuery]
,而
MyDto dto
会被当成
[FromBody]
——但这个“默认规则”极易被忽略,导致 POST 请求体为空、GET 参数收不到。

真实踩坑场景:前端发

POST /api/users
带 JSON,后端方法写成
public IActionResult Create(User user)
,结果
user
始终为
null
,因为没加
[FromBody]

查询参数(URL ?a=1&b=2)→ 用
[FromQuery]
JSON/XML 请求体 → 用
[FromBody]
(且一个方法最多一个)
路由段值(如
/api/users/{id}
)→ 用
[FromRoute]
或直接写在路由模板里
表单数据(
application/x-www-form-urlencoded
)→ 用
[FromForm]
,别指望
[FromBody]
能解析它

返回 JSON 时字段名大小写不一致?检查
JsonSerializerOptions.PropertyNamingPolicy

默认情况下,.NET 6+ 使用

JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase
,所以 C# 类的
UserName
会序列化成
userName
。但如果你手动 new
JsonSerializerOptions()
却没设这个,或用了旧版 Newtonsoft.Json(
JsonProperty
特性没生效),字段名就可能全大写或全小写,前端解包失败。

典型错误现象:Postman 看响应是

{"UserName":"abc"}
,但 Axios 收到的是
undefined
,因为 JS 解构写了
const { userName } = res.data

全局配置(推荐):在
Program.cs
里加
builder.Services.ConfigureHttpJsonOptions(options => { options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
局部覆盖:用
JsonResult
构造时传入自定义
JsonSerializerOptions
别混用 System.Text.Json 和 Newtonsoft.Json 的配置——它们互不识别对方的特性

CORS 报错 “No 'Access-Control-Allow-Origin' header”?别只在控制器上加
[EnableCors]

很多人加了

[EnableCors("MyPolicy")]
还是 403,因为中间件顺序错了。CORS 中间件必须在
UseRouting()
之后、
UseEndpoints()
之前注册,否则预检请求(OPTIONS)根本进不到策略匹配环节。

更隐蔽的问题:策略名拼错、没允许凭据(

AllowCredentials()
)、或者前端带了
Authorization
头但策略里没显式
WithHeaders("Authorization")

Program.cs
配置策略:
builder.Services.AddCors(options => { options.AddPolicy("MyPolicy", policy => policy.WithOrigins("https://localhost:5173").AllowAnyMethod().AllowAnyHeader().AllowCredentials()); });
中间件顺序必须是:
UseRouting()
UseCors()
UseAuthentication()
UseAuthorization()
UseEndpoints()
开发阶段可先用
AllowAnyOrigin()
排查,但上线前必须锁定具体域名

Web API 的难点不在“怎么写第一个接口”,而在“为什么这个接口在本地能跑,部署后就 404 或 500”。路由模板拼写、模型绑定源声明、JSON 序列化策略、CORS 中间件位置——这些地方一错,错误信息往往不指向根因。动手前先确认这四点,比反复重启 IIS 或重写 Controller 有用得多。

相关推荐