Angularjs 将错误消息从Web Api返回到$http

Angularjs 将错误消息从Web Api返回到$http,angularjs,asp.net-web-api,Angularjs,Asp.net Web Api,我正在使用Angular 1.5和ASP.NETWebAPI 2。我想在$http.get请求失败时显示一条错误消息。遗憾的是,错误回调仅包含常规状态文本(例如,内部服务器错误),而不包含我指定的消息。我怎样才能做到 Web Api控制器: public IHttpActionResult GetSomething() { try { var result = new HttpResponseMessage(HttpStatusCode.OK); result.Conte

我正在使用Angular 1.5和ASP.NETWebAPI 2。我想在$http.get请求失败时显示一条错误消息。遗憾的是,错误回调仅包含常规状态文本(例如,内部服务器错误),而不包含我指定的消息。我怎样才能做到

Web Api控制器:

public IHttpActionResult GetSomething()
{
  try
  {
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new ByteArrayContent(GetContent(...));
    return ResponseMessage(result);
  }
  catch (Exception ex)
  {
    return InternalServerError(ex);
  }
}
角度呼叫:

$http.get('url')
.then(function (result) {
...            
}, function (error) {
  //$scope.errorMessage= ???
});

您可以创建自己的结果,其中包含您想要的任何内容:

public class ServerErrorResult : HttpActionErrorResult
{
    public Exception Exception {get; set;}

    public override Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var content = Content;
        if(Exception != null)
        {
            content += $"\r\nException Details:{Exception.Message}";
        }
        var response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent(content),
            RequestMessage = Request;
        };

        return Task.FromResult(response);
    }
}
您还可以在控制器上创建一个扩展方法,以将某些管道抽象出来:

public static HttpActionErrorResult ServerError(this ApiController controller, Exception ex)
{
    return new ServerErrorResult 
        {
            Exception = ex
        };
}
从控制器中调用它,如下所示:

public IHttpActionResult GetSomething()
{
  try
  {
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new ByteArrayContent(GetContent(...));
    return ResponseMessage(result);
  }
  catch (Exception ex)
  {
      return ServerError(ex);
  }
}

希望能有所帮助。

您可以创建自己的结果,其中包括您想要的任何内容:

public class ServerErrorResult : HttpActionErrorResult
{
    public Exception Exception {get; set;}

    public override Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var content = Content;
        if(Exception != null)
        {
            content += $"\r\nException Details:{Exception.Message}";
        }
        var response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent(content),
            RequestMessage = Request;
        };

        return Task.FromResult(response);
    }
}
您还可以在控制器上创建一个扩展方法,以将某些管道抽象出来:

public static HttpActionErrorResult ServerError(this ApiController controller, Exception ex)
{
    return new ServerErrorResult 
        {
            Exception = ex
        };
}
从控制器中调用它,如下所示:

public IHttpActionResult GetSomething()
{
  try
  {
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new ByteArrayContent(GetContent(...));
    return ResponseMessage(result);
  }
  catch (Exception ex)
  {
      return ServerError(ex);
  }
}
希望有帮助