如何从HttpResponseMessage(HttpStatusCode, Exception)中检索已传递的异常

8
根据以下网站,您可以向HttpResponseMessage.CreateErrorResponse方法传递异常参数(https://msdn.microsoft.com/en-us/library/jj127064(v=vs.118).aspx)。
我的问题是如何从CreateErrorResponse方法创建的HttpResponseMessage中检索异常信息。如果无法获取异常信息,那么以输入异常作为重载方法的点在哪里?
澄清一下,我不需要以下答案... 我知道我可以在正文内容中传递自定义错误原因(http://weblogs.asp.net/fredriknormen/asp-net-web-api-exception-handling),但我真的只是想知道如何使用HttpRequestMessageExtensions.CreateErrorResponse方法(HttpRequestMessage, HttpStatusCode, Exception)方法重载。
示例WebAPI控制器:
Route("location/{locationName}/Databases/{databasename}/ProcedureSession")][LocationSetUp]
public HttpResponseMessage Post([FromBody] ProcedureSessionData procedureSession)
    {
        try
        {
            throw new Exception("test Exception");
        }
        catch (Exception e)
        {
           return Request.CreateErrorResponse(HttpStatusCode.InternalServerError,
             e);
        }
    }

如何在这段代码中捕获异常:

using (var client = new HttpClient())
  {
    client.BaseAddress = new Uri("http://localhost/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    string api = "testApi/location/here/databases/testDb/ProcedureSession";
    HttpResponseMessage response = client.PostAsJsonAsync(api, newSessionData).Result;
    if (!response.IsSuccessStatusCode)
    {
         //how can i pick up the exception object from here? 
         //Or am I missing the point of this CreateErrorResponse overload?
    }

2
你能展示一下你所尝试的代码或者你正在尝试做什么吗? - MethodMan
2个回答

14

要从HttpResponseMessage获取错误消息,您需要获取HttpError对象,如下所示。然后,HttpError对象包含ExceptionMessage、ExceptionType和StackTrace信息。

if(!response.IsSuccessStatusCode){
    HttpError error = response.Content.ReadAsAsync<HttpError>().Result;
}

6

你可以尝试使用

 response.EnsureSuccessStatusCode()

如果没有收到成功的响应代码,将抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接