2015-02-11 61 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