2014-03-29 164 views
0

我正在學習c#中的web api。我想知道如何捕捉從服務器端發送的響應對象的異常消息。在客戶端捕獲異常消息

假設這是服務器端拋出的響應異常消息。所以我如何在客戶端捕獲它。通過使用正常的嘗試抓住它沒有顯示的消息。

try 
{ 
} 
catch{Exception exception) 
{ 

var errorMessage = new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(exception.Message) }; 
        throw new HttpResponseException(errorMessage); 
} 
+0

檢查這個問題,你可能會得到一些線索。 http://stackoverflow.com/questions/12260300/throwing-httpresponseexception-in-webapi-action-method-returning-empty-200-respo – Vinod

回答

2

這取決於誰是Web API的客戶端。

  • C#客戶端「異常」風格 - 您將不會收到拋出的直接異常。你應該自己檢查返回的HttpResponseMessage

    using (var client = new HttpClient() { BaseAddress = "http://someurl.com" }) 
    using (var responseMessage = await client.GetAsync("resources/123") 
    { 
        try 
        { 
         // EnsureSuccessStatusCode will throw HttpRequestException exception if 
         // status code is not successfull 
         responseMessage.EnsureSuccessStatusCode(); 
    
         // Here you should process your response if it is successfull. 
         // Something like 
         // var result = await responseMessage.Content.ReadAsAsync<MyClass>(); 
        } 
        catch (HttpRequestException) 
        { 
         var errorContent = await responseMessage.Content.ReadAsStringAsync(); 
         // "errorContent" variable will contain your exception message. 
        } 
    } 
    
  • C#客戶端「如果」的風格 - 你也可以達到同樣的效果而不引發例外

    if (responseMessage.IsSuccessStatusCode) 
    { 
        // Here you should process your response if it is successfull. 
        // Something like 
        // var result = await responseMessage.Content.ReadAsAsync<MyClass>(); 
    } 
    else 
    { 
        var errorContent = await responseMessage.Content.ReadAsStringAsync(); 
        // "errorContent" variable will contain your exception message. 
    } 
    
  • 的JavaScript - 取決於你會用什麼庫呼叫服務,但通常都他們提供了一些錯誤回調參數,您可以在其中傳遞錯誤處理函數。

+2

添加到你的答案,你不能在catch塊中使用await。下一個C#版本將支持。 – PSR

0

我只想補充從服務器端發送例外客戶端的全過程:

1在服務器端:

[HttpGet] 
public HttpResponseMessage DoSomething([FromUri] string ValtoProcess) 
{ 
    try 
    { 
     return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, new { result, message }); 
    } 
    catch(exception ex) 
    { 
     HttpResponseMessage Response =Request.CreateErrorResponse(HttpStatusCode.InternalServerError,ex.InnerException.Message); 
      throw new HttpResponseException(Response); 
    } 

,然後在客戶端,以防萬一的響應狀態不正常讀取錯誤如下:

string ErrorMessage = await TaskReponse.Content.ReadAsStringAsync(); 
相關問題