Swashbuckle与.NET Core:错误时如何返回空响应体?
问题:如何让ASP.NET Core接口的406响应返回空响应体?
我正在创建如下接口:
/// <summary> /// Starts a new validation process /// </summary> /// <param name="order"></param> /// <response code="201">Campaing created successfully</response> /// <response code="400">An invalid request has been made. Check response for details.</response> /// <response code="406">A campaing is already in progress for this target for this requestor</response> [HttpPut] [Produces("application/json")] [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(ValidationProcessBase))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(IEnumerable<string>))] [ProducesResponseType(StatusCodes.Status406NotAcceptable)] public async Task StartNewProcess([FromBody] StartValidationProcessOrder order) { //return null; }
我希望406响应的响应体为空(类似204响应),但当前返回的是ProblemDetails格式,请问如何实现?
解决方法
ASP.NET Core默认会将错误状态码包装为ProblemDetails格式,要让406返回空响应体,可按以下步骤调整:
修改接口返回类型
将方法返回类型从Task改为Task<IActionResult>,这样可以灵活返回不同类型的响应结果。手动返回406状态码(无响应体)
在触发406的业务逻辑分支中,直接返回StatusCodeResult,不要抛出异常(抛出异常会被框架自动包装为ProblemDetails)。
更新后的接口代码示例:
/// <summary> /// Starts a new validation process /// </summary> /// <param name="order"></param> /// <response code="201">Campaing created successfully</response> /// <response code="400">An invalid request has been made. Check response for details.</response> /// <response code="406">A campaing is already in progress for this target for this requestor</response> [HttpPut] [Produces("application/json")] [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(ValidationProcessBase))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(IEnumerable<string>))] [ProducesResponseType(StatusCodes.Status406NotAcceptable)] public async Task<IActionResult> StartNewProcess([FromBody] StartValidationProcessOrder order) { // 示例:判断是否已有进行中的流程 bool isProcessInProgress = await CheckIfProcessIsInProgressAsync(order); if (isProcessInProgress) { // 返回406状态码,无响应体 return new StatusCodeResult(StatusCodes.Status406NotAcceptable); } // 正常流程:创建验证流程并返回201 var validationResult = await _validationService.CreateProcessAsync(order); return CreatedAtAction(nameof(GetProcess), new { id = validationResult.Id }, validationResult); }
- 保留Swagger注解
原有的[ProducesResponseType(StatusCodes.Status406NotAcceptable)]注解无需修改,它会在Swagger文档中正确标识该状态码无响应体。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

