ASP.NET MVC如何为整个控制器类统一配置全局HTTP响应类型
解决方案
有两种常用的实现方案,可根据你的适用范围选择:
方案1:控制器级统一配置
Produces、ProducesResponseType这类API接口特性原生支持直接标注在控制器类上,标注后会对控制器内所有的Action方法生效,无需每个方法重复配置。如果单个Action有特殊的响应规则,直接在方法上单独加对应特性即可,方法级的配置优先级高于类级,会自动覆盖冲突的配置项。
示例代码如下:
// 控制器类上统一加公共响应配置 [Produces("application/json")] [ProducesResponseType((int)HttpStatusCode.NotFound)] [ProducesResponseType((int)HttpStatusCode.BadRequest)] [ProducesResponseType((int)HttpStatusCode.InternalServerError)] [ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { /// <summary> A summary describing the endpoint</summary> [HttpPost("RenameSomething/", Name = "Rename[controller]")] [ProducesResponseType((int)HttpStatusCode.OK)] // 仅该接口特有的成功状态码单独配置即可 public ActionResult RenameSomething() { // 此处写业务实现 } // 控制器内其他所有Action都会自动继承类上的公共响应配置,无需重复标注 }
方案2:全局统一配置
如果所有控制器的所有接口都需要复用相同的公共响应配置,可以直接在项目启动时全局注册,连控制器上的标注都可以省略:
.NET 6及以上版本示例(Program.cs中配置):
var builder = WebApplication.CreateBuilder(args); // 注册控制器服务时添加全局过滤器 builder.Services.AddControllers(options => { options.Filters.Add(new ProducesAttribute("application/json")); options.Filters.Add(new ProducesResponseTypeAttribute((int)HttpStatusCode.NotFound)); options.Filters.Add(new ProducesResponseTypeAttribute((int)HttpStatusCode.BadRequest)); options.Filters.Add(new ProducesResponseTypeAttribute((int)HttpStatusCode.InternalServerError)); });
如果是.NET 5及更早版本,在Startup.cs的ConfigureServices方法中做相同配置即可。
内容的提问来源于stack exchange,提问作者jonadv
相关产品推荐
相关产品推荐

