基于.Net的Web API 控制器及方法相关注解属性

在这里插入图片描述

文章目录

在这里插入图片描述

这些属性主要用于定义 API 的路由、HTTP 方法、参数绑定、响应类型、授权、Swagger 文档等,通常位于控制器类或 Action 方法上。

1. 路由与 HTTP 方法 (Microsoft.AspNetCore.Mvc 命名空间)

  • [ApiController]
    • 作用: 应用于控制器类。启用 API 特定的约定和行为:
      • 自动 HTTP 400 响应: 当模型验证失败时,自动返回 BadRequestResult (400),包含 ModelState 错误详情。
      • 推断参数源: 自动推断复杂类型参数来自请求体 ([FromBody]),简单类型来自查询字符串 ([FromQuery]) 或路由 ([FromRoute])。
      • 属性路由要求: 要求控制器使用 [Route][HttpGet] 等属性定义路由。
      • 错误状态码详细信息: 在 4xx 错误响应中包含 ProblemDetails 格式的错误信息。
  • [Route]
    • 作用: 定义控制器或 Action 方法的 URL 路由模板。可应用于控制器(为所有 Action 方法设置前缀)或 Action 方法。
    • 参数:
      • Template (必填): URL 路由模板字符串。可以使用 [controller](控制器名去掉 “Controller” 后缀)、[action](方法名)占位符。模板中可用 {param} 定义路由参数。
      • Name (可选): 为路由指定一个唯一名称,用于生成 URL (IUrlHelper 或链接)。
      • Order (可选): 路由匹配的顺序(数字越小优先级越高)。
  • HTTP 方法属性 ([HttpGet], [HttpPost], [HttpPut], [HttpDelete], [HttpPatch], [HttpHead], [HttpOptions])
    • 作用: 指定 Action 方法响应哪个 HTTP 方法(动词)。它们本质上是带有固定 HttpMethod[HttpMethod] 属性的快捷方式。通常与 [Route] 或内联路由模板一起使用。
    • 参数:
      • Template (可选): 内联的路由模板字符串。如果提供,它会覆盖或附加到控制器路由模板。
      • Name (可选): 路由名称。
      • Order (可选): 路由顺序。
  • [AcceptVerbs]
    • 作用: 允许 Action 方法响应多个 HTTP 方法。指定一个或多个 HTTP 方法字符串(如 "GET", "POST", "PATCH")。
    • 参数:
      • verbs (必填): 允许的 HTTP 方法列表。
  • [NonAction]
    • 作用: 标记控制器类中的某个公共方法不是一个 Action 方法。防止 MVC 框架将其视为可路由的 HTTP 端点。

示例:

publicclassUsersController:ControllerBase{// 这是一个 Action 方法[HttpGet("{id}")]publicIActionResultGetUser(int id){...}// 这是一个公共辅助方法,但不是 Action[NonAction]publicstringGeneratePasswordResetToken(){...}}

示例:

[AcceptVerbs("GET","HEAD")]// 响应 GET 和 HEAD 请求publicIActionResultGetInfo(int id){...}

示例:

[HttpGet]// 映射到 GET api/productspublicIEnumerable<Product>GetAll(){...}[HttpGet("{id}")]// 映射到 GET api/products/5publicActionResult<Product>GetById(int id){...}[HttpPost("create")]// 映射到 POST api/products/createpublicIActionResultCreateProduct([FromBody]Product product){...}[HttpPut("{id}")]// 映射到 PUT api/products/5publicIActionResultUpdateProduct(int id,[FromBody]Product product){...}[HttpDelete("{id}")]// 映射到 DELETE api/products/5publicIActionResultDeleteProduct(int id){...}

示例:

[ApiController][Route("api/v{version:apiVersion}/[controller]")]// 控制器级路由,带版本publicclassOrdersController:ControllerBase{[HttpGet("{id:int}")]// Action 级路由,组合成 api/v1/orders/5publicIActionResultGetById(int id){...}[HttpPost]// 使用控制器路由前缀:api/v1/orderspublicIActionResultCreate(Order order){...}[Route("~/legacy/orders")]// 覆盖控制器前缀,使用根级路由 /legacy/orderspublicIActionResultGetLegacyOrders(){...}}

示例:

[ApiController][Route("api/[controller]")]// 必需属性路由publicclassProductsController:ControllerBase{// ...}

2. 参数绑定源 (Microsoft.AspNetCore.Mvc 命名空间)

  • [FromBody]
    • 作用: 指示参数应从 HTTP 请求的正文中绑定。通常用于绑定复杂的 JSON/XML 对象。在 [ApiController] 中,复杂类型参数默认使用此来源。
  • [FromQuery]
    • 作用: 指示参数应从 URL 查询字符串中绑定。在 [ApiController] 中,简单类型参数默认使用此来源。
  • [FromRoute]
    • 作用: 指示参数应从 URL 路由数据中绑定(由路由模板中的 {param} 定义)。在 [ApiController] 中,如果路由模板中有匹配名称的参数,默认使用此来源。
  • [FromHeader]
    • 作用: 指示参数应从 HTTP 请求头中绑定。
  • [FromForm]
    • 作用: 指示参数应从 HTTP 请求的已提交表单数据中绑定。常用于 multipart/form-dataapplication/x-www-form-urlencoded 内容类型。
  • [FromServices]
    • 作用: 指示参数应通过依赖注入 (DI) 容器解析获得,而不是从请求中绑定。用于在 Action 方法中注入服务。
  • [BindRequired] / [BindNever]
    • 作用:
      • [BindRequired]: 指示参数是必需的,如果无法绑定(如从查询字符串缺少值),则模型验证会失败。
      • [BindNever]: 指示参数应被完全忽略,不进行绑定。常用于防止过度提交攻击(Mass Assignment)。

示例:

publicclassUserUpdateModel{publicstring Username {get;set;}[BindRequired]// 更新时必须提供 Emailpublicstring Email {get;set;}[BindNever]// 防止客户端设置 IsAdmin 属性publicbool IsAdmin {get;set;}}

示例:

[HttpPost]publicIActionResultPlaceOrder(Order order,[FromServices]IOrderService orderService){ orderService.ProcessOrder(order);returnOk();}

示例:

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

示例:

[HttpGet]publicIActionResultGet([FromHeader(Name ="X-Client-Version")]string clientVersion){// 从请求头 X-Client-Version 获取值}

示例:

[HttpGet("{id:int}")]publicIActionResultGetById([FromRoute]int id)// 从路由 /api/products/5 中绑定 id=5{// ...}

示例:

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

示例:

[HttpPost]publicIActionResultCreate([FromBody]Product product)// 从请求体 JSON 绑定{// ...}

3. 响应类型与格式 (Microsoft.AspNetCore.Mvc 命名空间)

  • [Produces]
    • 作用: 应用于控制器或 Action 方法,指定 Action 方法返回的响应内容类型(MIME 类型,如 "application/json", "application/xml")。影响 Content-Type 响应头和客户端内容协商。
    • 参数:
      • contentType (必填): 内容类型字符串。
      • Type (可选): 返回对象类型的 Type (常用于 Swagger 文档)。
      • StatusCodes (可选): 关联的状态码数组 (常用于 Swagger 文档)。
  • [Consumes]
    • 作用: 应用于控制器或 Action 方法,指定 Action 方法接受的请求内容类型(MIME 类型)。用于内容协商,如果请求的 Content-Type 不匹配,框架会返回 415 Unsupported Media Type
    • 参数:
      • contentType (必填): 内容类型字符串。
  • [ProducesResponseType]
    • 作用:强烈推荐使用! 指定 Action 方法返回的特定 HTTP 状态码及其关联的响应类型。主要用于:
      1. Swagger/OpenAPI 文档生成: 为工具(如 SwaggerUI)提供清晰的 API 契约。
      2. 增强代码可读性: 明确说明方法可能返回哪些状态码。
    • 参数:
      • statusCode (必填): HTTP 状态码(如 200, 201, 400, 404, 500)。建议使用 StatusCodes 常量(如 StatusCodes.Status200OK)。
      • Type (可选): 成功响应(2xx)时返回的对象类型。对于错误响应(4xx/5xx),通常是 ProblemDetailsstring
      • ContentType (可选): 响应的内容类型。
  • [ProducesDefaultResponseType]
    • 作用: 当无法匹配其他 [ProducesResponseType] 指定的状态码时,指定一个默认的响应类型。常用于捕获未明确声明的错误(如 500 Internal Server Error)。
    • 参数:
      • Type (可选): 默认响应的对象类型(通常是 ProblemDetails)。

示例:

[HttpDelete("{id}")][ProducesResponseType(StatusCodes.Status204NoContent)]// 删除成功[ProducesResponseType(StatusCodes.Status404NotFound)]// 找不到资源[ProducesDefaultResponseType(typeof(ProblemDetails))]// 其他错误(如服务器异常)publicIActionResultDelete(int id){try{// ... 删除逻辑,可能抛出异常returnNoContent();}catch(NotFoundException){returnNotFound();}// 其他异常会被 [ApiController] 捕获并返回 500 + ProblemDetails}

示例:

[HttpGet("{id}")][ProducesResponseType(StatusCodes.Status200OK, Type =typeof(Product))]// 成功返回 Product[ProducesResponseType(StatusCodes.Status404NotFound)]// 找不到资源[ProducesResponseType(StatusCodes.Status400BadRequest)]// 无效请求(如 id 格式错误)publicActionResult<Product>GetById(int id){if(id <=0)returnBadRequest("ID must be positive");var product = _repository.GetProduct(id);if(product ==null)returnNotFound();return product;}[HttpPost][ProducesResponseType(StatusCodes.Status201Created, Type =typeof(Product))]// 创建成功,返回新资源[ProducesResponseType(StatusCodes.Status400BadRequest, Type =typeof(ValidationProblemDetails))]// 验证失败,返回 ProblemDetailspublicasyncTask<ActionResult<Product>>Create([FromBody]Product product){if(!ModelState.IsValid)returnBadRequest(ModelState);// [ApiController] 自动处理为 400 + ValidationProblemDetailsvar createdProduct =await _repository.AddProductAsync(product);returnCreatedAtAction(nameof(GetById),new{ id = createdProduct.Id }, createdProduct);// 201 Created}

示例:

[HttpPost][Consumes("application/json")]// 只接受 Content-Type 为 application/json 的请求publicIActionResultCreate([FromBody]Product product){...}[HttpPost("upload")][Consumes("multipart/form-data")]// 接受文件上传publicIActionResultUpload([FromForm]IFormFile file){...}

示例:

[ApiController][Route("api/[controller]")][Produces("application/json")]// 控制器级:所有 Action 默认生成 JSONpublicclassProductsController:ControllerBase{[HttpGet("{id}")][Produces("application/xml")]// 覆盖控制器设置,此 Action 生成 XMLpublicProductGetById(int id){...}[HttpGet][Produces("application/json","application/xml")]// 支持 JSON 和 XML 内容协商publicIEnumerable<Product>GetAll(){...}}

4. 授权与认证 (Microsoft.AspNetCore.Authorization 命名空间)

  • [Authorize]
    • 作用: 要求用户必须经过认证(登录)才能访问该控制器或 Action 方法。如果未认证,返回 401 Unauthorized。可应用于控制器(保护所有方法)或单个 Action 方法。
    • 参数:
      • AuthenticationSchemes (可选): 指定使用的认证方案(如 "Bearer", "Cookies")。
      • Policy (可选): 指定授权策略名称(需要在 Startup.cs 中配置策略)。
      • Roles (可选): 指定允许访问的用户角色(逗号分隔)。用户需要拥有其中至少一个角色。
  • [AllowAnonymous]
    • 作用: 允许匿名用户访问被 [Authorize] 保护的控制器或 Action 方法。通常用于登录、注册等不需要认证的接口。
    • 示例: 见上面 [Authorize] 示例中的 PublicInfo 方法。
  • [Authorize(Policy = "...")]
    • 作用: 使用自定义授权策略进行访问控制。策略在 Startup.csConfigureServices 中使用 services.AddAuthorization 配置,可以包含复杂的授权要求(如年龄限制、声明要求、自定义处理程序)。
  • [RequiredScope] (通常用于 Azure AD / Microsoft Identity Platform)
    • 作用: 要求请求的访问令牌 (access_token) 必须包含指定的作用域 (Scope)。这是实现 OAuth2 权限控制的关键。
    • 参数:
      • RequiredScopes (必填): 要求的作用域数组。

示例:

[HttpGet("reports")][RequiredScope("Reports.Read","Reports.ReadWrite")]// 需要 Reports.Read 或 Reports.ReadWrite 权限publicIActionResultGetReports(){...}

示例:

// 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])publicIActionResultDelete(int id){...}

示例:

[ApiController][Authorize]// 整个控制器需要登录[Route("api/[controller]")]publicclassSecureController:ControllerBase{[HttpGet("userinfo")]publicIActionResultGetUserInfo(){...}// 需要登录[HttpGet("admin")][Authorize(Roles ="Administrator")]// 需要登录且角色为 AdministratorpublicIActionResultAdminOnly(){...}}[AllowAnonymous]// 覆盖控制器的 [Authorize],允许匿名访问[HttpGet("public")]publicIActionResultPublicInfo(){...}

5. Swagger/OpenAPI 文档增强 (Swashbuckle.AspNetCore.AnnotationsMicrosoft.AspNetCore.Mvc)

  • [SwaggerOperation] (Swashbuckle)
    • 作用: 为特定的 API 操作(Action 方法)添加摘要 (Summary) 和详细描述 (Description)。
    • 参数:
      • Summary: 操作的简短摘要。
      • Description: 操作的详细描述。
      • OperationId: 自定义操作的唯一标识符(覆盖默认生成)。
      • Tags: 自定义操作的标签(覆盖默认的控制器名)。
  • [SwaggerResponse] (Swashbuckle)
    • 作用: 替代或补充 [ProducesResponseType],为 Swagger 提供更详细的响应信息(如响应头、示例)。与 [ProducesResponseType] 通常一起使用或单独使用。
    • 参数:
      • statusCode (必填): HTTP 状态码。
      • Type (可选): 响应体类型。
      • Description (可选): 响应的描述。
      • ContentTypes (可选): 响应的内容类型。
  • [SwaggerParameter] (Swashbuckle)
    • 作用: 为参数添加描述或指定其是否必需(覆盖默认推断)。
    • 参数:
      • Name: 参数名称。
      • Description: 参数描述。
      • Required: 是否必需(覆盖默认)。
      • In: 参数位置 (ParameterLocation.Query, .Path, .Header, .Body),覆盖默认推断。
  • [SwaggerSchema] (Swashbuckle)
    • 作用: 应用于模型类或属性,为 Swagger Schema 提供额外信息(如描述、示例值、是否只读/必填)。
    • 参数:
      • Description: 模型或属性的描述。
      • ReadOnly: 是否只读(在响应中出现,不应在请求中发送)。
      • Required: 是否必需(覆盖数据注解的 [Required] 对于 Swagger 的影响)。
      • Example: 提供示例值。
  • [ProducesErrorResponseType] (AspNetCore.Mvc) - 与 Swagger 配合
    • 作用: 当与 [ProducesDefaultResponseType] 或特定错误 [ProducesResponseType] 结合使用时,明确告知 Swagger 默认错误响应的类型(通常是 ProblemDetailsHttpValidationProblemDetails)。

示例:

[ApiController][ProducesErrorResponseType(typeof(ProblemDetails))]// 告诉 Swagger 默认错误响应是 ProblemDetails[Route("api/[controller]")]publicclassMyController:ControllerBase{...}

示例:

publicclassProduct{[SwaggerSchema("The unique identifier of the product", ReadOnly =true)]publicint Id {get;set;}[Required][SwaggerSchema("The name of the product", Example ="Apple iPhone 13")]publicstring Name {get;set;}[SwaggerSchema("The price in USD", Format ="decimal")]publicdecimal Price {get;set;}}

示例:

[HttpGet("search")]publicIActionResultSearch([FromQuery,SwaggerParameter("Name of the product to search for", Required =true)]string name,[FromQuery,SwaggerParameter("Minimum price filter")]decimal? minPrice){...}

示例:

[HttpGet("{id}")][ProducesResponseType(StatusCodes.Status200OK)]// MVC 行为[SwaggerResponse(200,"The product was found",typeof(Product))]// Swagger 文档增强[SwaggerResponse(404,"The product does not exist",typeof(NotFoundResult))]publicActionResult<Product>GetById(int id){...}

示例:

[HttpPost][SwaggerOperation( Summary ="Creates a new product", Description ="Requires administrator privileges. Returns the created product with its generated ID.", OperationId ="CreateProduct", Tags =new[]{"Admin"})]publicActionResult<Product>Create([FromBody]Product product){...}

在这里插入图片描述

Read more

【降低 30% 开发成本:使用 Trae IDE 将 Figma 设计稿转化为前端代码】

【降低 30% 开发成本:使用 Trae IDE 将 Figma 设计稿转化为前端代码】

降低 30% 开发成本:使用 Trae IDE 将 Figma 设计稿转化为前端代码_ide_葡萄城技术团队-葡萄城开发者空间 TRAE与Figma MCP:iOS原生应用UI自动生成的艺术-易源AI资讯 | 万维易源 Login | Figma 基于提供的Figma设计文件和网页链接,开发一个完整的前端网站项目。具体要求如下: 1. 页面展示要求: * 采用平铺式布局展示所有页面 * 严格遵循Figma设计稿中的视觉规范 * 实现IOS风格的高保真原型效果 * 确保所有交互元素与设计稿一致 2. 技术实现要求: * 使用现代前端框架(如React/Vue) * 实现响应式布局,适配不同设备 * 添加平滑的页面过渡动画 * 确保所有UI组件的高还原度 3. 交付物要求: * 完整的可运行前端代码 * 详细的部署文档 * 跨浏览器兼容性测试报告 * 性能优化方案 4. 质量标准: * 像素级还原设计稿 * 所有交互功能完整可用 * 代码符合最佳实践

前端Bug修复专家:从现象到根因,再到测试闭环的SOP

引言:Bug 排查的“猜谜游戏” 作为一名前端工程师,你是否经历过这样的场景:测试人员扔过来一个 Bug 描述——“用户点了某个按钮后,页面就卡死了,偶尔复现,请尽快修复”。你打开代码,面对几百行业务逻辑,只能凭感觉加个 try-catch 或 setTimeout,推上去后却被告知“还是不行”。更令人头疼的是,某些问题只在 iOS Safari 上出现,某些问题需要快速连续点击才能复现。 这种“面向猜测编程”的排查方式,往往导致修复方案治标不治本,甚至引入新的 Bug。如何摆脱这种困境?今天,我想向大家介绍一套我从多年实战中总结出的前端缺陷诊断与修复专家技能(可以称之为 bugfix-expert),它不仅帮你“修好代码”,更帮你建立一套“现象 → 根因 → 修复 → 测试”的标准化作业程序(SOP)。 技能概述:不仅仅是修 Bug

前端实战:手把手教你接入腾讯云 ASR 实时语音识别(避坑指南)

前端实战:手把手教你接入腾讯云 ASR 实时语音识别(避坑指南)

在数字人交互、智能客服或语音助手的 Web 开发中,实时语音识别(ASR) 是最基础也是最核心的入口。市面上方案众多,今天我们基于一个真实的测试文件 test-asr.html,深入剖析如何在前端(H5/Web)直接接入腾讯云的一句话识别 SDK。 这篇文章不讲废话,只讲代码里的“魔鬼细节”和真实调试经验。 1. 为什么选择纯前端接入? 通常 ASR 接入有两种模式: 1. 后端代理:前端录音传给后端,后端调用腾讯云 API。安全,但延迟高。 2. 前端直连:浏览器直接录音并通过 WebSocket 直连腾讯云。速度最快,交互体验最好。 我们手中的 test-asr.html 采用的就是前端直连方案。这种方案最大的挑战在于:如何在前端安全且正确地生成鉴权签名,以及如何处理复杂的音频流事件。 2. 核心依赖与准备 代码中引入了两个关键文件: <

【Js逆向 python】Web JS 逆向全体系详细解释

【Js逆向 python】Web JS 逆向全体系详细解释

Web JS 逆向全体系内容 互联网技术安全提示与职业操守 做渗透测试,必须严格遵守以下原则: 1. 合法授权:仅在书面授权的范围内使用逆向技术,禁止未授权测试; 2. 最小影响:避免使用高风险参数(如sqlmap工具的 --risk=3、--os-shell),防止目标服务崩溃; 3. 数据保护:枚举到的敏感数据(如用户密码)需严格保密,测试后立即删除; 4. 留痕清理:测试结束后,协助目标清除测试留下的日志、文件等痕迹。 免责声明 1. 本文所述所有渗透测试技术、工具、命令及实战案例,仅适用于已获得目标系统 / 网络所有者书面授权的测试场景(如企业内部安全评估、甲方委托的红队测试、个人合法拥有的实验环境)。 2. 任何组织或个人若未取得明确书面授权,擅自将本文内容用于对第三方系统 / 网络的扫描、探测、攻击等行为,均属于非法网络活动,涉嫌违反《中华人民共和国网络安全法》《中华人民共和国刑法》(第