从 .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 返回错误消息的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core API 从 Web API 返回响应,不包括 cookie

Blazor ASP.Net Core 3.1 Web API 在发布时返回 404 错误

通过 ASP.NET Core Web API 使用存储过程从 SQL Server 返回多个行集

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值

从 ASP.NET MVC 项目调用 .NET CORE 5 Web API 微服务时无法检索 BadRequest 错误

响应 JWT 错误的 Authentication Asp.Net Core Web Api