You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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返回空响应体,可按以下步骤调整:

  1. 修改接口返回类型
    将方法返回类型从Task改为Task<IActionResult>,这样可以灵活返回不同类型的响应结果。

  2. 手动返回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);
}
  1. 保留Swagger注解
    原有的[ProducesResponseType(StatusCodes.Status406NotAcceptable)]注解无需修改,它会在Swagger文档中正确标识该状态码无响应体。

内容的提问来源于stack exchange,提问作者Leonardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:20:33