下面给出 ASP-NET Core 中最常用、也是最推荐使用的 ControllerBase 快捷方法 的完整清单(全部返回 IActionResult 或其泛型 ActionResult)。
每个方法都对应一种 HTTP 状态码,背后都有对应的 Result 类(如 OkObjectResult、BadRequestObjectResult 等)。
为方便记忆,按状态码分组列出,并给出调用示例与对应的底层 Result 类型。
✅ 2xx 成功
| 快捷方法 | HTTP 状态码 | 典型场景 | 对应 Result 类 |
|---|---|---|---|
| Ok() / Ok(value) | 200 | 成功并返回(可选)数据 | OkResult / OkObjectResult |
| CreatedAtAction | 201 | 创建资源成功,并在响应头给出 Location | CreatedAtActionResult |
| CreatedAtRoute | 201 | 同上,但以路由名定位 | CreatedAtRouteResult |
| Accepted() / Accepted(value) | 202 | 请求已被接受但尚未处理完成 | AcceptedResult / AcceptedAtActionResult |
| NoContent() | 204 | 成功但无返回体 | NoContentResult |
示例
[HttpPost]
public IActionResult Create(UserDto dto)
{
var id = _service.Add(dto);
return CreatedAtAction(nameof(GetById), new { id }, null); // 201
}
❌ 4xx 客户端错误
| 快捷方法 | HTTP 状态码 | 典型场景 | 对应 Result 类 |
|---|---|---|---|
| BadRequest() / BadRequest(error) | 400 | 参数校验失败 | BadRequestResult / BadRequestObjectResult |
| Unauthorized() | 401 | 未提供或令牌无效 | UnauthorizedResult |
| Forbid() | 403 | 已登录但无权限 | ForbidResult |
| NotFound() / NotFound(error) | 404 | 资源不存在 | NotFoundResult / NotFoundObjectResult |
| Conflict() / Conflict(error) | 409 | 资源状态冲突 | ConflictResult / ConflictObjectResult |
| UnprocessableEntity() | 422 | 语义正确但无法处理 | UnprocessableEntityObjectResult |
| ValidationProblem() | 400 | 专门用于模型验证错误 | ValidationProblemDetails |
| Problem() | 任意 4xx/5xx | 返回标准 ProblemDetails | ObjectResult |
示例
if (!ModelState.IsValid)
return ValidationProblem(ModelState); // 400 + ProblemDetails
var entity = _repo.Find(id);
return entity is null ? NotFound() : Ok(entity); // 404 / 200
⚠️ 5xx 服务器错误
| 快捷方法 | HTTP 状态码 | 典型场景 | 对应 Result 类 |
|---|---|---|---|
| StatusCode(500) | 500 | 通用服务器内部错误 | StatusCodeResult |
| Problem(statusCode:500) | 500 | 使用 ProblemDetails 格式 | ObjectResult |
示例
try
{
_service.DoRiskJob();
return Ok();
}
catch (Exception ex)
{
return Problem(title: "服务器异常", detail: ex.Message, statusCode: 500);
}
📌 其他常用辅助方法
| 方法 | 作用 |
|---|---|
| File() | 返回文件内容(FileContentResult / FileStreamResult / VirtualFileResult) |
| PhysicalFile() | 直接返回磁盘文件 |
| Redirect() / RedirectPermanent() | 302/301 重定向 |
| RedirectToAction() / RedirectToRoute() | 重定向到同一站点内 Action 或路由 |
| LocalRedirect() | 仅允许站内相对路径 |
| Content() | 直接返回字符串或任意文本 |
✅ 使用建议
- 优先使用 ControllerBase 的快捷方法(Ok、BadRequest、NotFound 等)——代码更短、语义更明确。
- 需要统一错误格式时,用
Problem()或ValidationProblem(),它们会自动生成符合 RFC 7807 的ProblemDetails。 - Swagger/OpenAPI 友好:在 Action 上标记
[ProducesResponseType(typeof(Product), StatusCodes.Status200OK)],生成更精确的文档。
掌握以上方法,即可覆盖日常 Web API 开发中 99% 的返回场景。