从 .NET Core Web API 返回错误消息

Posted

技术标签:

【中文标题】从 .NET Core Web API 返回错误消息【英文标题】:Returning error message from .NET Core Web API 【发布时间】:2020-09-07 17:12:13 【问题描述】:

我有一个 .NET Core Web API 控制器来处理一个 POST 请求,该请求接受一个 JSON ApiUser 对象并返回一个 ApiUser 对象

[HttpPost]
public ApiUser Post([FromBody] ApiUser model) 
    return new ApiUser();

假设我想向客户端返回一条错误消息:“电子邮件已存在。” 我不知道如何以简单的方式最好地做到这一点。

我可以向 ApiUser(以及我通过 API 返回的所有其他类)添加一个“ErrorMsg”属性,但不确定这是否是正确的方法。

“Pre-Core”,我会抛出一个 HttpResponseException,Core 不支持它。这很好,因为它会创建一个带有“消息”的简单 JSON,然后我可以抓取它。 (Goofy:我会使用状态 202 Accepted 作为我的客户的标志,表明我们有一个“已知错误”。)

throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.Accepted, msg));

(我想我更愿意在控制器内部处理这个问题,而不是“过滤器”或“中间件”。后两者的一个问题是,如果我添加剃须刀页面,我想我需要知道如果错误来自 api 调用或 UI 网络调用。)

更新 #1

似乎我可以执行以下操作(返回 ActionResult)来模拟我之前使用 HttpResponseException 所做的事情。仍然不确定是否执行这样的操作或通过将 ErrorMsg 添加到 ApiUser 返回状态 200 会更好。

[HttpPost]
public async Task<ActionResult<ApiUser>> Post([FromBody] ApiUser model) 
    ...
    if (emailExists) return StatusCode(400, "Email already exists.");
    else return user;

【问题讨论】:

类似/相同的问题:***.com/questions/41464540/…***.com/questions/47142142/… 【参考方案1】:

您可以在核心 web api 中使用HttpResponseException

  [HttpPost]
        public ApiUser Post([FromBody] ApiUser model)
        
            if (model.Email == "11")// this condition can be changed as your requirement.
            
                var response = new HttpResponseMessage(HttpStatusCode.BadRequest);
                response.Content = new StringContent("Email already exists.");
                throw new HttpResponseException(response);
            

            return new ApiUser();
        

这是测试结果:

更新

您也可以将返回类型更改为IActionResult 以返回不同的内容,如下所示:

   [HttpPost]
        public IActionResult Post([FromBody] ApiUser model)
        
            if (model.Email == "11")// this condition can be changed as your requirement.
             
                return BadRequest("Email already exists.");
            

            return Ok(new ApiUser());
        

测试结果和之前一样。

【讨论】:

如果我安装一个名为“Microsoft.AspNet.WebApi.Core”的包,我似乎仍然可以使用“HttpResponseException”,但自 2018 年以来一直没有更新。我不确定是最好的解决方案。很棒的视频。我刚刚安装了 Postman 来帮助我进行测试。 @ErnieThomason,如果您不想使用 HttpResponseException,您可以将返回类型更改为IActionResult ,作为您在问题中更新的方法,但有一些细节需要更改,我已在我的帖子中更新,您可以关注它。 非常感谢您的帮助。这为我提供了有关我的选择的足够信息,以便我可以继续前进。

以上是关于从 .NET Core Web API 返回错误消息的主要内容,如果未能解决你的问题,请参考以下文章