文章目录

这些属性主要用于定义 API 的路由、HTTP 方法、参数绑定、响应类型、授权、Swagger 文档等,通常位于控制器类或 Action 方法上。
1. 路由与 HTTP 方法 (Microsoft.AspNetCore.Mvc
命名空间)
-
[ApiController]
- 作用: 应用于控制器类。启用 API 特定的约定和行为:
- 自动 HTTP 400 响应: 当模型验证失败时,自动返回
BadRequestResult
(400),包含ModelState
错误详情。 - 推断参数源: 自动推断复杂类型参数来自请求体 (
[FromBody]
),简单类型来自查询字符串 ([FromQuery]
) 或路由 ([FromRoute]
)。 - 属性路由要求: 要求控制器使用
[Route]
或[HttpGet]
等属性定义路由。 - 错误状态码详细信息: 在 4xx 错误响应中包含
ProblemDetails
格式的错误信息。
- 自动 HTTP 400 响应: 当模型验证失败时,自动返回
- 示例:
[ApiController] [Route("api/[controller]")] // 必需属性路由 public class ProductsController : ControllerBase { // ... }
- 作用: 应用于控制器类。启用 API 特定的约定和行为:
-
[Route]
- 作用: 定义控制器或 Action 方法的 URL 路由模板。可应用于控制器(为所有 Action 方法设置前缀)或 Action 方法。
- 参数:
Template
(必填): URL 路由模板字符串。可以使用[controller]
(控制器名去掉 “Controller” 后缀)、[action]
(方法名)占位符。模板中可用{param}
定义路由参数。Name
(可选): 为路由指定一个唯一名称,用于生成 URL (IUrlHelper
或链接)。Order
(可选): 路由匹配的顺序(数字越小优先级越高)。
- 示例:
[ApiController] [Route("api/v{version:apiVersion}/[controller]")] // 控制器级路由,带版本 public class OrdersController : ControllerBase { [HttpGet("{id:int}")] // Action 级路由,组合成 api/v1/orders/5 public IActionResult GetById(int id) { ... } [HttpPost] // 使用控制器路由前缀:api/v1/orders public IActionResult Create(Order order) { ... } [Route("~/legacy/orders")] // 覆盖控制器前缀,使用根级路由 /legacy/orders public IActionResult GetLegacyOrders() { ... } }
-
HTTP 方法属性 (
[HttpGet]
,[HttpPost]
,[HttpPut]
,[HttpDelete]
,[HttpPatch]
,[HttpHead]
,[HttpOptions]
)- 作用: 指定 Action 方法响应哪个 HTTP 方法(动词)。它们本质上是带有固定
HttpMethod
的[HttpMethod]
属性的快捷方式。通常与[Route]
或内联路由模板一起使用。 - 参数:
Template
(可选): 内联的路由模板字符串。如果提供,它会覆盖或附加到控制器路由模板。Name
(可选): 路由名称。Order
(可选): 路由顺序。
- 示例:
[HttpGet] // 映射到 GET api/products public IEnumerable<Product> GetAll() { ... } [HttpGet("{id}")] // 映射到 GET api/products/5 public ActionResult<Product> GetById(int id) { ... } [HttpPost("create")] // 映射到 POST api/products/create public IActionResult CreateProduct([FromBody] Product product) { ... } [HttpPut("{id}")] // 映射到 PUT api/products/5 public IActionResult UpdateProduct(int id, [FromBody] Product product) { ... } [HttpDelete("{id}")] // 映射到 DELETE api/products/5 public IActionResult DeleteProduct(int id) { ... }
- 作用: 指定 Action 方法响应哪个 HTTP 方法(动词)。它们本质上是带有固定
-
[AcceptVerbs]
- 作用: 允许 Action 方法响应多个 HTTP 方法。指定一个或多个 HTTP 方法字符串(如
"GET"
,"POST"
,"PATCH"
)。 - 参数:
verbs
(必填): 允许的 HTTP 方法列表。
- 示例:
[AcceptVerbs("GET", "HEAD")] // 响应 GET 和 HEAD 请求 public IActionResult GetInfo(int id) { ... }
- 作用: 允许 Action 方法响应多个 HTTP 方法。指定一个或多个 HTTP 方法字符串(如
-
[NonAction]
- 作用: 标记控制器类中的某个公共方法不是一个 Action 方法。防止 MVC 框架将其视为可路由的 HTTP 端点。
- 示例:
public class UsersController : ControllerBase { // 这是一个 Action 方法 [HttpGet("{id}")] public IActionResult GetUser(int id) { ... } // 这是一个公共辅助方法,但不是 Action [NonAction] public string GeneratePasswordResetToken() { ... } }
2. 参数绑定源 (Microsoft.AspNetCore.Mvc
命名空间)
-
[FromBody]
- 作用: 指示参数应从 HTTP 请求的正文中绑定。通常用于绑定复杂的 JSON/XML 对象。在
[ApiController]
中,复杂类型参数默认使用此来源。 - 示例:
[HttpPost] public IActionResult Create([FromBody] Product product) // 从请求体 JSON 绑定 { // ... }
- 作用: 指示参数应从 HTTP 请求的正文中绑定。通常用于绑定复杂的 JSON/XML 对象。在
-
[FromQuery]
- 作用: 指示参数应从 URL 查询字符串中绑定。在
[ApiController]
中,简单类型参数默认使用此来源。 - 示例:
[HttpGet("search")] public IActionResult SearchProducts([FromQuery] string name, [FromQuery] int? minPrice) { // GET /api/products/search?name=apple&minPrice=10 }
- 作用: 指示参数应从 URL 查询字符串中绑定。在
-
[FromRoute]
- 作用: 指示参数应从 URL 路由数据中绑定(由路由模板中的
{param}
定义)。在[ApiController]
中,如果路由模板中有匹配名称的参数,默认使用此来源。 - 示例:
[HttpGet("{id:int}")] public IActionResult GetById([FromRoute] int id) // 从路由 /api/products/5 中绑定 id=5 { // ... }
- 作用: 指示参数应从 URL 路由数据中绑定(由路由模板中的
-
[FromHeader]
- 作用: 指示参数应从 HTTP 请求头中绑定。
- 示例:
[HttpGet] public IActionResult Get([FromHeader(Name = "X-Client-Version")] string clientVersion) { // 从请求头 X-Client-Version 获取值 }
-
[FromForm]
- 作用: 指示参数应从 HTTP 请求的已提交表单数据中绑定。常用于
multipart/form-data
或application/x-www-form-urlencoded
内容类型。 - 示例:
[HttpPost("upload")] public IActionResult UploadFile([FromForm] IFormFile file, [FromForm] string description) { // ... }
- 作用: 指示参数应从 HTTP 请求的已提交表单数据中绑定。常用于
-
[FromServices]
- 作用: 指示参数应通过依赖注入 (DI) 容器解析获得,而不是从请求中绑定。用于在 Action 方法中注入服务。
- 示例:
[HttpPost] public IActionResult PlaceOrder(Order order, [FromServices] IOrderService orderService) { orderService.ProcessOrder(order); return Ok(); }
-
[BindRequired]
/[BindNever]
- 作用:
[BindRequired]
: 指示参数是必需的,如果无法绑定(如从查询字符串缺少值),则模型验证会失败。[BindNever]
: 指示参数应被完全忽略,不进行绑定。常用于防止过度提交攻击(Mass Assignment)。
- 示例:
public class UserUpdateModel { public string Username { get; set; } [BindRequired] // 更新时必须提供 Email public string Email { get; set; } [BindNever] // 防止客户端设置 IsAdmin 属性 public bool IsAdmin { get; set; } }
- 作用:
3. 响应类型与格式 (Microsoft.AspNetCore.Mvc
命名空间)
-
[Produces]
- 作用: 应用于控制器或 Action 方法,指定 Action 方法返回的响应内容类型(MIME 类型,如
"application/json"
,"application/xml"
)。影响Content-Type
响应头和客户端内容协商。 - 参数:
contentType
(必填): 内容类型字符串。Type
(可选): 返回对象类型的Type
(常用于 Swagger 文档)。StatusCodes
(可选): 关联的状态码数组 (常用于 Swagger 文档)。
- 示例:
[ApiController] [Route("api/[controller]")] [Produces("application/json")] // 控制器级:所有 Action 默认生成 JSON public class ProductsController : ControllerBase { [HttpGet("{id}")] [Produces("application/xml")] // 覆盖控制器设置,此 Action 生成 XML public Product GetById(int id) { ... } [HttpGet] [Produces("application/json", "application/xml")] // 支持 JSON 和 XML 内容协商 public IEnumerable<Product> GetAll() { ... } }
- 作用: 应用于控制器或 Action 方法,指定 Action 方法返回的响应内容类型(MIME 类型,如
-
[Consumes]
- 作用: 应用于控制器或 Action 方法,指定 Action 方法接受的请求内容类型(MIME 类型)。用于内容协商,如果请求的
Content-Type
不匹配,框架会返回415 Unsupported Media Type
。 - 参数:
contentType
(必填): 内容类型字符串。
- 示例:
[HttpPost] [Consumes("application/json")] // 只接受 Content-Type 为 application/json 的请求 public IActionResult Create([FromBody] Product product) { ... } [HttpPost("upload")] [Consumes("multipart/form-data")] // 接受文件上传 public IActionResult Upload([FromForm] IFormFile file) { ... }
- 作用: 应用于控制器或 Action 方法,指定 Action 方法接受的请求内容类型(MIME 类型)。用于内容协商,如果请求的
-
[ProducesResponseType]
- 作用: 强烈推荐使用! 指定 Action 方法返回的特定 HTTP 状态码及其关联的响应类型。主要用于:
- Swagger/OpenAPI 文档生成: 为工具(如 SwaggerUI)提供清晰的 API 契约。
- 增强代码可读性: 明确说明方法可能返回哪些状态码。
- 参数:
statusCode
(必填): HTTP 状态码(如200
,201
,400
,404
,500
)。建议使用StatusCodes
常量(如StatusCodes.Status200OK
)。Type
(可选): 成功响应(2xx)时返回的对象类型。对于错误响应(4xx/5xx),通常是ProblemDetails
或string
。ContentType
(可选): 响应的内容类型。
- 示例:
[HttpGet("{id}")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(Product))] // 成功返回 Product [ProducesResponseType(StatusCodes.Status404NotFound)] // 找不到资源 [ProducesResponseType(StatusCodes.Status400BadRequest)] // 无效请求(如 id 格式错误) public ActionResult<Product> GetById(int id) { if (id <= 0) return BadRequest("ID must be positive"); var product = _repository.GetProduct(id); if (product == null) return NotFound(); return product; } [HttpPost] [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(Product))] // 创建成功,返回新资源 [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ValidationProblemDetails))] // 验证失败,返回 ProblemDetails public async Task<ActionResult<Product>> Create([FromBody] Product product) { if (!ModelState.IsValid) return BadRequest(ModelState); // [ApiController] 自动处理为 400 + ValidationProblemDetails var createdProduct = await _repository.AddProductAsync(product); return CreatedAtAction(nameof(GetById), new { id = createdProduct.Id }, createdProduct); // 201 Created }
- 作用: 强烈推荐使用! 指定 Action 方法返回的特定 HTTP 状态码及其关联的响应类型。主要用于:
-
[ProducesDefaultResponseType]
- 作用: 当无法匹配其他
[ProducesResponseType]
指定的状态码时,指定一个默认的响应类型。常用于捕获未明确声明的错误(如500 Internal Server Error
)。 - 参数:
Type
(可选): 默认响应的对象类型(通常是ProblemDetails
)。
- 示例:
[HttpDelete("{id}")] [ProducesResponseType(StatusCodes.Status204NoContent)] // 删除成功 [ProducesResponseType(StatusCodes.Status404NotFound)] // 找不到资源 [ProducesDefaultResponseType(typeof(ProblemDetails))] // 其他错误(如服务器异常) public IActionResult Delete(int id) { try { // ... 删除逻辑,可能抛出异常 return NoContent(); } catch (NotFoundException) { return NotFound(); } // 其他异常会被 [ApiController] 捕获并返回 500 + ProblemDetails }
- 作用: 当无法匹配其他
4. 授权与认证 (Microsoft.AspNetCore.Authorization
命名空间)
-
[Authorize]
- 作用: 要求用户必须经过认证(登录)才能访问该控制器或 Action 方法。如果未认证,返回
401 Unauthorized
。可应用于控制器(保护所有方法)或单个 Action 方法。 - 参数:
AuthenticationSchemes
(可选): 指定使用的认证方案(如"Bearer"
,"Cookies"
)。Policy
(可选): 指定授权策略名称(需要在Startup.cs
中配置策略)。Roles
(可选): 指定允许访问的用户角色(逗号分隔)。用户需要拥有其中至少一个角色。
- 示例:
[ApiController] [Authorize] // 整个控制器需要登录 [Route("api/[controller]")] public class SecureController : ControllerBase { [HttpGet("userinfo")] public IActionResult GetUserInfo() { ... } // 需要登录 [HttpGet("admin")] [Authorize(Roles = "Administrator")] // 需要登录且角色为 Administrator public IActionResult AdminOnly() { ... } } [AllowAnonymous] // 覆盖控制器的 [Authorize],允许匿名访问 [HttpGet("public")] public IActionResult PublicInfo() { ... }
- 作用: 要求用户必须经过认证(登录)才能访问该控制器或 Action 方法。如果未认证,返回
-
[AllowAnonymous]
- 作用: 允许匿名用户访问被
[Authorize]
保护的控制器或 Action 方法。通常用于登录、注册等不需要认证的接口。 - 示例: 见上面
[Authorize]
示例中的PublicInfo
方法。
- 作用: 允许匿名用户访问被
-
[Authorize(Policy = "...")]
- 作用: 使用自定义授权策略进行访问控制。策略在
Startup.cs
的ConfigureServices
中使用services.AddAuthorization
配置,可以包含复杂的授权要求(如年龄限制、声明要求、自定义处理程序)。 - 示例:
// Startup.cs services.AddAuthorization(options => { options.AddPolicy("Over18", policy => policy.RequireAssertion(context => context.User.HasClaim(c => (c.Type == "Age" && int.Parse(c.Value) >= 18))); options.AddPolicy("CanDelete", policy => policy.RequireClaim("Permission", "Delete")); }); // Controller [HttpDelete("{id}")] [Authorize(Policy = "Over18")] // 要求年龄 >= 18 [Authorize(Policy = "CanDelete")] // 要求拥有 "Delete" 权限声明 (可以组合多个 [Authorize]) public IActionResult Delete(int id) { ... }
- 作用: 使用自定义授权策略进行访问控制。策略在
-
[RequiredScope]
(通常用于 Azure AD / Microsoft Identity Platform)- 作用: 要求请求的访问令牌 (
access_token
) 必须包含指定的作用域 (Scope)。这是实现 OAuth2 权限控制的关键。 - 参数:
RequiredScopes
(必填): 要求的作用域数组。
- 示例:
[HttpGet("reports")] [RequiredScope("Reports.Read", "Reports.ReadWrite")] // 需要 Reports.Read 或 Reports.ReadWrite 权限 public IActionResult GetReports() { ... }
- 作用: 要求请求的访问令牌 (
5. Swagger/OpenAPI 文档增强 (Swashbuckle.AspNetCore.Annotations
或 Microsoft.AspNetCore.Mvc
)
-
[SwaggerOperation]
(Swashbuckle)- 作用: 为特定的 API 操作(Action 方法)添加摘要 (
Summary
) 和详细描述 (Description
)。 - 参数:
Summary
: 操作的简短摘要。Description
: 操作的详细描述。OperationId
: 自定义操作的唯一标识符(覆盖默认生成)。Tags
: 自定义操作的标签(覆盖默认的控制器名)。
- 示例:
[HttpPost] [SwaggerOperation( Summary = "Creates a new product", Description = "Requires administrator privileges. Returns the created product with its generated ID.", OperationId = "CreateProduct", Tags = new[] { "Admin" })] public ActionResult<Product> Create([FromBody] Product product) { ... }
- 作用: 为特定的 API 操作(Action 方法)添加摘要 (
-
[SwaggerResponse]
(Swashbuckle)- 作用: 替代或补充
[ProducesResponseType]
,为 Swagger 提供更详细的响应信息(如响应头、示例)。与[ProducesResponseType]
通常一起使用或单独使用。 - 参数:
statusCode
(必填): HTTP 状态码。Type
(可选): 响应体类型。Description
(可选): 响应的描述。ContentTypes
(可选): 响应的内容类型。
- 示例:
[HttpGet("{id}")] [ProducesResponseType(StatusCodes.Status200OK)] // MVC 行为 [SwaggerResponse(200, "The product was found", typeof(Product))] // Swagger 文档增强 [SwaggerResponse(404, "The product does not exist", typeof(NotFoundResult))] public ActionResult<Product> GetById(int id) { ... }
- 作用: 替代或补充
-
[SwaggerParameter]
(Swashbuckle)- 作用: 为参数添加描述或指定其是否必需(覆盖默认推断)。
- 参数:
Name
: 参数名称。Description
: 参数描述。Required
: 是否必需(覆盖默认)。In
: 参数位置 (ParameterLocation.Query
,.Path
,.Header
,.Body
),覆盖默认推断。
- 示例:
[HttpGet("search")] public IActionResult Search( [FromQuery, SwaggerParameter("Name of the product to search for", Required = true)] string name, [FromQuery, SwaggerParameter("Minimum price filter")] decimal? minPrice) { ... }
-
[SwaggerSchema]
(Swashbuckle)- 作用: 应用于模型类或属性,为 Swagger Schema 提供额外信息(如描述、示例值、是否只读/必填)。
- 参数:
Description
: 模型或属性的描述。ReadOnly
: 是否只读(在响应中出现,不应在请求中发送)。Required
: 是否必需(覆盖数据注解的[Required]
对于 Swagger 的影响)。Example
: 提供示例值。
- 示例:
public class Product { [SwaggerSchema("The unique identifier of the product", ReadOnly = true)] public int Id { get; set; } [Required] [SwaggerSchema("The name of the product", Example = "Apple iPhone 13")] public string Name { get; set; } [SwaggerSchema("The price in USD", Format = "decimal")] public decimal Price { get; set; } }
-
[ProducesErrorResponseType]
(AspNetCore.Mvc) - 与 Swagger 配合- 作用: 当与
[ProducesDefaultResponseType]
或特定错误[ProducesResponseType]
结合使用时,明确告知 Swagger 默认错误响应的类型(通常是ProblemDetails
或HttpValidationProblemDetails
)。 - 示例:
[ApiController] [ProducesErrorResponseType(typeof(ProblemDetails))] // 告诉 Swagger 默认错误响应是 ProblemDetails [Route("api/[controller]")] public class MyController : ControllerBase { ... }
- 作用: 当与