跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#

.NET Web API 控制器常用注解属性详解

.NET Web API 开发中,控制器注解决定了路由规则、参数来源、响应格式及安全策略。梳理了 Microsoft.AspNetCore.Mvc 核心命名空间下的关键属性,涵盖 [ApiController] 自动约定、[Route] 路径定义、[FromBody] 等绑定源、[Produces] 内容协商以及 [Authorize] 权限控制。结合 Swagger 文档增强实践,帮助开发者构建规范、安全且易维护的 RESTful 接口。

DevStack发布于 2026/3/27更新于 2026/9/950 浏览

.NET Web API 控制器常用注解属性详解

在 .NET Core 或 .NET 5+ 开发中,Web API 控制器的行为很大程度上由特性(Attribute)定义。这些注解不仅决定了路由规则、参数来源和响应格式,还涉及安全认证与文档生成。下面结合实战场景,梳理 Microsoft.AspNetCore.Mvc 及相关命名空间下的核心注解。

1. 路由与 HTTP 方法

路由是 API 的入口,而 HTTP 方法定义了操作类型。

[ApiController] 与自动约定

将 [ApiController] 应用于控制器类时,框架会启用一系列针对 API 的默认行为:

  • 自动模型验证:当模型验证失败时,自动返回 400 Bad Request 及 ModelState 详情。
  • 推断参数源:复杂类型参数默认来自请求体 ([FromBody]),简单类型默认来自查询字符串 ([FromQuery])。
  • 错误处理:在 4xx 错误中包含 ProblemDetails 格式信息。
  • 强制属性路由:通常要求使用 [Route] 或 [HttpGet] 等显式定义路由。

路由模板与 HTTP 动词

[Route] 用于定义 URL 路径,支持 {param} 占位符及 [controller] 等系统变量。配合 [HttpGet], [HttpPost] 等快捷方式可指定具体 HTTP 方法。

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    // 映射到 GET api/products/5
    [HttpGet("{id:int}")]
    public IActionResult GetById(int id)
    {
        // ...
    }

    // 映射到 POST api/products/create
    [HttpPost("create")]
    public IActionResult Create([FromBody] Product product)
    {
        // ...
    }

    // 非 Action 方法需标记,防止被误认为端点
    []
     => ;
}
NonAction
public string GenerateToken()
"..."

若需同时响应多个方法,可使用 [AcceptVerbs("GET", "HEAD")]。

2. 参数绑定源

明确参数来源能避免歧义,特别是在混合使用路由、查询和 Body 数据时。

注解说明
[FromBody]从请求正文绑定,常用于 JSON/XML 对象。
[FromQuery]从 URL 查询字符串绑定,如 ?id=1。
[FromRoute]从路由模板中的 {param} 绑定。
[FromHeader]从 HTTP 请求头获取值。
[FromForm]从表单数据绑定,适用于文件上传或多部分提交。
[FromServices]通过依赖注入容器解析服务实例。

注意:[BindRequired] 确保参数必须存在,否则验证失败;[BindNever] 则完全忽略该参数,常用于防止过度提交攻击(Mass Assignment)。

[HttpPost("upload")]
public IActionResult UploadFile(
    [FromForm] IFormFile file,
    [FromForm] string description)
{
    // ...
}

[HttpGet("search")]
public IActionResult SearchProducts(
    [FromQuery] string name,
    [FromQuery] int? minPrice)
{
    // GET /api/products/search?name=apple&minPrice=10
}

3. 响应类型与格式

规范响应类型有助于客户端协商及 Swagger 文档生成。

  • [Produces]: 指定返回的内容类型(MIME),如 application/json。
  • [Consumes]: 指定接受的内容类型,不匹配时返回 415 Unsupported Media Type。
  • [ProducesResponseType]: 强烈推荐。声明特定状态码对应的响应类型,对 Swagger 文档至关重要。
  • [ProducesDefaultResponseType]: 设置未明确声明时的默认错误响应类型。
[HttpDelete("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult Delete(int id)
{
    try
    {
        // 删除逻辑
        return NoContent();
    }
    catch (NotFoundException)
    {
        return NotFound();
    }
}

4. 授权与认证

安全是 API 的重中之重,主要依赖 Microsoft.AspNetCore.Authorization 命名空间。

  • [Authorize]: 强制用户登录。可作用于控制器或单个方法,支持指定策略或角色。
  • [AllowAnonymous]: 覆盖控制器的 [Authorize],允许匿名访问(如登录接口)。
  • [RequiredScope]: 用于 OAuth2/OIDC,要求访问令牌包含特定作用域。
[ApiController]
[Authorize]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{
    // 需要登录
    [HttpGet("userinfo")]
    public IActionResult GetUserInfo() { ... }

    // 需要 Administrator 角色
    [HttpGet("admin")]
    [Authorize(Roles = "Administrator")]
    public IActionResult AdminOnly() { ... }

    // 覆盖全局授权,允许匿名
    [AllowAnonymous]
    [HttpGet("public")]
    public IActionResult PublicInfo() { ... }
}

5. Swagger/OpenAPI 文档增强

为了让生成的文档更友好,可以使用 Swashbuckle.AspNetCore.Annotations 提供的注解。

  • [SwaggerOperation]: 设置摘要、描述和操作 ID。
  • [SwaggerResponse]: 补充响应细节,如示例或描述。
  • [SwaggerParameter]: 为参数添加描述或标记必填。
  • [SwaggerSchema]: 在模型类上定义字段描述、示例值及只读性。
public class Product
{
    [SwaggerSchema("产品唯一标识", ReadOnly = true)]
    public int Id { get; set; }

    [Required]
    [SwaggerSchema("产品名称", Example = "iPhone 13")]
    public string Name { get; set; }
}

[HttpPost]
[SwaggerOperation(
    Summary = "创建新产品",
    Description = "需要管理员权限",
    OperationId = "CreateProduct",
    Tags = new[] { "Admin" })]
public ActionResult<Product> Create([FromBody] Product product)
{
    // ...
}

通过合理使用这些注解,不仅能减少样板代码,还能让 API 契约更加清晰,极大提升前后端协作效率。

目录

  1. .NET Web API 控制器常用注解属性详解
  2. 1. 路由与 HTTP 方法
  3. [ApiController] 与自动约定
  4. 路由模板与 HTTP 动词
  5. 2. 参数绑定源
  6. 3. 响应类型与格式
  7. 4. 授权与认证
  8. 5. Swagger/OpenAPI 文档增强

更多推荐文章

查看全部
  • 使用 rclone 将远程 WebDAV 文件共享映射为本地硬盘
  • C++ 异常处理:理论、栈展开与最佳实践
  • AI 大模型学习资源指南:十大核心平台与工具详解
  • 安路 FPGA 下载器驱动安装与测试教程
  • WebArena:真实网页环境下的自主智能体构建与评估
  • VSCode 本地部署 DeepSeek 模型实现私有化 AI 编程
  • 大模型分布式训练方法:数据、张量与流水线并行详解
  • 使用 VPN 后 Mac 出现能联网但无法访问网页的问题
  • 企业微信 Webhook 机器人 Java 集成指南
  • 西门子 TIA Portal V19 安装与配置指南
  • LLaMA-Factory 微调多模态大模型 Qwen3-VL
  • DooTask:AI 赋能的开源项目协作工具部署与使用指南
  • AI 驱动移动机器人提升化学合成效率,Nature 发表智能实验室研究
  • DeepSeek-R1-Distill-Llama-8B 在线演示教程
  • AgentCPM 轻量开源智能体全流程落地方案
  • Flutter 三方库 ethereum_addresses 的鸿蒙化适配指南
  • Spring Boot 邮件与消息通知
  • 大学生论文写作:AI 工具全流程实战指南
  • Python 在日常生活与职场中的核心应用及发展分析
  • 深入理解 Magpie 缩放算法:Bilinear、Bicubic 与 Lanczos 对比

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online