2014-03-29 122 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(); 
相关问题