2015-02-11 95 views
0

我有以下的WebAPI行动:投射到正确的类型?

public async Task<IHttpActionResult> PostCustomer(DTO.Customer customer) 
    { 
     try 
     { 
      //Save in Db here... 
      return Ok(customer); 
     } 
     catch (ValidationException<CustomerError> vex) 
     { 
      return ResponseMessage(Request.CreateResponse(HttpStatusCode.Conflict, vex)); 
     } 
     catch (DatabaseException dex) 
     { 
      return ResponseMessage(Request.CreateResponse(HttpStatusCode.Conflict, dex)); 
     } 
     catch (Exception ex) 
     { 
      return InternalServerError(ex); 
     } 
    } 

动作可以返回一个更新的客户DTO或不同的异常(ValidationException和DatabaseException是自定义例外)。

我有一个通用的请求类,用下面的方法Save

public virtual T Save(T current) 
    { 
     response = client.PostAsJsonAsync<T>(updateUrl, current).Result; 

     return Response(); 
    } 

    private T Response() 
    { 
     if (response.IsSuccessStatusCode) 
     { 
      var result = response.Content.ReadAsAsync<T>().Result; 
      original = result.DeepCopy<T>(); 

      return result; 
     } 

     else 
     { 
      dynamic e = response.Content.ReadAsAsync<ExpandoObject>().Result; 
      //throw ?? 
     } 
    } 

要测试的代码中,我阅读的内容为ExpandoObject,但显然这不是正确的解决方案。

如何才能知道响应具有哪种类型的异常,以便我可以将正确的异常转换/转发到调用表单?

回答

0

使用HttpResponseMessage.EnsureSuccessStatusCode

https://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage.ensuresuccessstatuscode%28v=vs.118%29.aspx

try 
{ 
    response.EnsureSuccessStatusCode(); 
    // Handle success 
} 
catch (HttpRequestException) 
{ 
    // Handle failure 
} 
+0

EnsureSuccessStatusCode()抛出一个例外是代码!= 200它不会抛出异常由网页API发送。 – 2015-02-11 13:25:02

+0

你不会在服务端捕获webapi动作方法上抛出的异常,但在这种情况下,你可以设置httpstatus代码,何时在客户端抛出httclception可以通过在webapi方法上设置的状态代码来处理它 – puko 2015-02-11 16:43:36