【问题标题】:How to get the exception from HttpResponseMessage in web API?如何从 Web API 中的 HttpResponseMessage 获取异常?
【发布时间】:2015-08-18 14:45:30
【问题描述】:

我正在尝试在 Web API 中实现自定义错误处理, 我需要从返回的 HttpResponseMessage 中获取异常。

我尝试通过以下方式获取异常信息:

response.Content.ReadAsAsync<HttpError>().Result

但我无法访问结果对象,尝试时遇到异常, 所以我显然做错了。

不知道怎么做, 我们将不胜感激。

编辑:

我的客户端代码不相关,它只是一个GET请求,服务器代码:

控制器动作抛出异常:

if (condition == true)
{
    var response = new HttpResponseMessage(HttpStatusCode.BadRequest)
    {
        Content = new StringContent("Some Exception Related Message"),
        ReasonPhrase = "Some More Info"
    };

    throw new HttpResponseException(response);
}

我实现的 DelegatingHandler 的 SendAsync 方法得到响应, 这就是我想要获取在上面的控制器操作中引发的异常的调用堆栈的地方。

errorDetails = new ResponseErrorDetailsFull
{
    Message = "An error has occurred.",
    ExceptionMessage = response.ReasonPhrase,
    StackTrace = response.Content.ReadAsAsync<HttpError>().Result.StackTrace 
};

编辑#2

好的,所以我发现如果我创建一个 ExceptionFilterAttribute,并覆盖 OnException(),使用我的 DelegatingHandler 上的属性,我可以访问上面代码中提到的异常。

有人能解释一下为什么会这样吗?

【问题讨论】:

  • 我读到我需要从中获取 HTTPError 对象并从那里获取堆栈跟踪,但是当我尝试提取它时出现异常,所以我显然做错了。

标签: c# .net asp.net-web-api


【解决方案1】:

要在响应内容中获取HttpError,您的服务器端API 代码需要将HttpError 实例写入响应流。

只有这样response.Content.ReadAsAsync&lt;HttpError&gt;().Result 才会产生该数据。

通常,如果服务器端代码抛出异常,默认行为是 HTTP 500(内部服务器错误)状态代码,响应消息中没有可解析的内容。

如果出现 HTTP 400(错误请求)或其他此类非 500(非 200)错误,通常会发回响应数据。 (验证错误等) 在这种情况下,您也许可以从响应中读取数据。

一般而言,对于任何错误情况,除非您的服务器端 API 代码未将已知类型写入响应,否则您无法从调用方的响应中读取它。

请发布您的服务器端和客户端代码,以便我们进一步帮助您。

【讨论】:

    【解决方案2】:

    我发现这个博客有很好的例子: http://nodogmablog.bryanhogan.net/2016/07/getting-web-api-exception-details-from-a-httpresponsemessage/

    我采用了一些更新的代码:

    if ((int)response.StatusCode >= 400)
     {
          exceptionResponse = JsonConvert.DeserializeObject<ExceptionResponse>(LogRequisicao.CorpoResposta);
          LogRequisicao.CorpoResposta = exceptionResponse.ToString() ;
          if (exceptionResponse.InnerException != null)
                 LogRequisicao.CorpoResposta += "\r\n InnerException: " + exceptionResponse.ToString();
     }
    

    使用对象:

    public class ExceptionResponse
        {
            public string Message { get; set; }
            public string ExceptionMessage { get; set; }
            public string ExceptionType { get; set; }
            public string StackTrace { get; set; }
            public ExceptionResponse InnerException { get; set; }
    
            public override String ToString()
            {
                return "Message: " + Message + "\r\n "
                    + "ExceptionMessage: " + ExceptionMessage + "\r\n "
                    + "ExceptionType: " + ExceptionType + " \r\n "
                    + "StackTrace: " + StackTrace + " \r\n ";           
            }  
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-25
      • 2016-12-02
      • 1970-01-01
      • 2014-02-12
      • 2023-03-08
      • 2012-02-28
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多