如何在web API中从HttpResponseMessage获得异常

本文关键字:HttpResponseMessage 异常 中从 API web | 更新日期: 2023-09-27 17:53:31

我试图在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上使用属性,我就能够访问上述代码中提到的异常。

有人能解释一下为什么这是这样工作的吗?

如何在web API中从HttpResponseMessage获得异常

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

只有这样,response.Content.ReadAsAsync<HttpError>().Result才会产生该数据。

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

在HTTP 400 (Bad Request)或其他类似的非500(非200)错误的情况下,通常会发回响应数据。(验证错误等)在这种情况下,您可以从响应中读取数据。

通常对于任何错误场景,除非您的服务器端API代码没有将已知类型写入响应中,否则您无法从调用方的响应中读取它。

请张贴您的服务器端和客户端代码,为我们进一步帮助您。

我发现这个博客有很好的例子: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 ";           
        }  
    }
相关文章:
  • 没有找到相关文章