C# .NET ApiController NoContent 204 响应无法映射到 ProblemDetails 响应正文

问题描述 投票:0回答:1

我想从

ProblemDetails
响应中渲染
Microsoft.AspNetCore.Mvc
(
NoContent()
) 响应正文。

{
    "type": "string",
    "title": "string",
    "status": 0,
    "detail": "string",
    "instance": "string"
}

根据文档,ProblemDetails

ProblemDetails
不会从任何小于 400 的状态代码自动渲染。

我尝试过用

修改
Program.cs

builder.services.AddProblemDetails
ProblemDetailsFactory, etc. 

(请参阅上面的文档链接)。

无论我做什么,我都没有运气得到204。

有人成功做过吗,可以吗?有没有正确方向的指点?

namespace Company.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class ImportantController : BaseController
    {
        [HttpGet]
        [ValidateModelState]
        [Route("/api/important")]
        [Produces("application/json")]
        [ProducesResponseType(typeof(IEnumerable<ImportantDataResponse>), 200)]
        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status204NoContent)]
        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
        public async Task<IActionResult> GetImportantData([FromQuery][Required] string dashboardId)
        {
            // ...
            try
            {
                IEnumerable<ImportantDataModel> objResult = await _circuitBreakerPolicy.ExecuteAsync(() => _service.GetImportantData(dashboardId));

                if (objResult.Count() > 0)
                {
                    return Ok(objResult);
                } 
                else 
                {
                    return NoContent();
                }
            }
            catch (Exception ex) 
            {
                throw;
            }

            return BadRequest();
        }
    }
}
asp.net-core-mvc asp.net-core-webapi .net-8.0
1个回答
0
投票

我尝试使用中间件拦截方法,并自定义响应,但得到的结果是:“对于状态代码为 204 的响应,写入响应正文无效。”的异常, enter image description here

根据HTTP状态码的定义,204状态码的意思是“No Content”,表示响应成功,但没有向客户端返回任何内容。因此,当您将响应状态码设置为204时,响应正文中设置的任何内容都不会被发送。

如果要指示资源未找到或不存在,可以使用

return NotFound();
404 状态码来指示。以下是一个示例,您可以作为参考:

[HttpGet]
[Route("/api/important")]
[Produces("application/json")]
[ProducesResponseType(typeof(IEnumerable<ImportantDataResponse>), 200)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
      
 public async Task<IActionResult> GetImportantData([FromQuery][Required] string dashboardId)
{

     try
     {
         var objResult = new List<ImportantDataModel>
     {
          
     };

         if (objResult.Count() > 0)
         {
             return Ok(objResult);
         }
         else
         {
             return NotFound();
         }
     }
     catch (Exception ex)
     {
         throw;
     }
     return BadRequest();
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.