【问题标题】:ASP.NET Core WebApi return error message to AngularJS $http promiseASP.NET Core WebApi 向 AngularJS $http 承诺返回错误消息
【发布时间】:2016-12-13 08:57:50
【问题描述】:

我想向 AngularJS UI 返回异常消息。 作为后端,我使用 ASP.NET Core Web Api 控制器:

    [Route("api/cars/{carNumber}")]
    public string Get(string carNumber)
    {
        var jsonHttpResponse = _carInfoProvider.GetAllCarsByNumber(carNumber);
        if (jsonHttpResponse.HasError)
        {
            var message = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(jsonHttpResponse.ErrorMessage)
            };

            throw new HttpResponseException(message);
        }

        return jsonHttpResponse.Content;
    }

但在 Angular 方面,失败承诺只看到 status 和 statusText "Internal server error":

如何将错误消息传递给 Core Web Api 的 Angular $http 失败承诺?

【问题讨论】:

  • 您在此代码中返回HttpStatusCode.InternalServerError,即HTTP 500。相反,您应该找出jsonHttpResponse 中的错误并将message 设置为该值。

标签: angularjs error-handling asp.net-core-mvc angular-promise


【解决方案1】:

除非你正在做一些exception filtering,否则throw new HttpResponseException(message) 将成为一个未捕获的异常,它将作为一个通用的 500 Internal Server Error 返回到你的前端。

您应该做的是返回一个状态码结果,例如BadRequestResult。这意味着您的方法需要返回IActionResult,而不是返回字符串:

[Route("api/cars/{carNumber}")]
public IActionResult Get(string carNumber)
{
    var jsonHttpResponse = _carInfoProvider.GetAllCarsByNumber(carNumber);
    if (jsonHttpResponse.HasError)
    {
        return BadRequest(jsonHttpResponse.ErrorMessage);
    }

    return Ok(jsonHttpResponse.Content);
}

另请参阅:我在 how to return uncaught exceptions as JSON 上的回答。 (如果您希望将所有个未捕获的异常作为 JSON 返回。)

【讨论】:

  • 但是如果这不是一个错误的请求呢?您可能会从后端收到异常,这将导致 500(内部服务器错误)。
  • @DanielPrzybylski 在这种情况下,您总是可以抛出异常(或允许未捕获的异常冒泡),从而将500 Internal Server Error 发送给客户端。或者,您可以自己返回状态码 500。
  • 这就是我最终所做的,我只是不确定什么时候不包括作为一种方便的方法。另外,我想知道如何像 HttpResponseException 在 .NET 4.x 中那样在 HttpResponse 中嵌入消息。
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2015-11-26
  • 2018-05-30
  • 2020-07-29
  • 2019-08-05
相关资源
最近更新 更多