web api抛出HttpResponseException以及如何在wpf客户端上接收

use*_*862 2 .net wpf asp.net-web-api

从我的wpf客户端我发送异步请求到web api,在这种情况下应该返回HttpResponseException,所以我尝试过

HttpResponseMessage response = new HttpResponseMessage();
response = client.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
   ...
} else {
    MessageBox.Show("Not active" + response.StatusCode + " : Message - " + response.ReasonPhrase);
}
Run Code Online (Sandbox Code Playgroud)

WebApi方面

private void GetData()
{
   try {
      data = RavenSession.Query<myobj>().Take(1024).ToList();
   } catch (WebException) {
         throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.ServiceUnavailable, "Database is not online!"));
   }
}
Run Code Online (Sandbox Code Playgroud)

再次在wpf客户端我想要获取HttpResponseException所以我将第一块代码包装到try catch块中

try{
    HttpResponseMessage response = new HttpResponseMessage();
    response = client.GetAsync(url).Result;
    if (response.IsSuccessStatusCode)
    {
       ...
    } else {
        MessageBox.Show("Not active" + response.StatusCode + " : Message - " + response.ReasonPhrase);
    }
}
catch(HttpResponseException e){
     MessageBox.Show(e.Message);
}
catch(Exception e){
     MessageBox.Show(e.Message);
}
Run Code Online (Sandbox Code Playgroud)

但是挡块根本没有被击中.我只能访问response.IsSuccessStatusCode但这样我无法从webservice返回到客户端的详细消息异常(我想显示详细的消息).

ken*_*yzx 5

Content属性中读取错误消息.

if (response.IsSuccessStatusCode)
{
   ...
} else {
    var errorMessage = response.Content.ReadAsStringAsync().Result; 
}
Run Code Online (Sandbox Code Playgroud)

并根据需要格式化字符串.

参考:(在文章中搜索"反序列化响应内容").

ASP.NET Web Api:解开HTTP错误结果和模型状态字典客户端