6

HttpClient用来调用我的 MVC 4 web api。在我的 Web API 调用中,它返回一个域对象。如果出现任何问题,HttpResponseException将在服务器上抛出一个自定义消息。

 [System.Web.Http.HttpGet]
  public Person Person(string loginName)
    {
        Person person = _profileRepository.GetPersonByEmail(loginName);
        if (person == null)
            throw new HttpResponseException(
      Request.CreateResponse(HttpStatusCode.NotFound, 
                "Person not found by this id: " + id.ToString()));

        return person;
    }

我可以使用 IE F12 在响应正文中看到自定义的错误消息。但是,当我使用 调用它时HttpClient,我没有收到自定义的错误消息,只有 http 代码。对于 404,“ReasonPhrase”始终是“未找到”,对于 500 代码,始终是“内部服务器错误”。

有任何想法吗?如何从 Web API 发回自定义错误消息,同时保持正常返回类型作为我的域对象?

4

3 回答 3

15

(将我的答案放在这里以获得更好的格式)

是的,我看到了,但是 HttpResponseMessage 没有 body 属性。我自己想通了: response.Content.ReadAsStringAsync().Result;。示例代码:

public T GetService<T>( string requestUri)
{
    HttpResponseMessage response =  _client.GetAsync(requestUri).Result;
    if( response.IsSuccessStatusCode)
    {
        return response.Content.ReadAsAsync<T>().Result;
    }
    else
    {
        string msg = response.Content.ReadAsStringAsync().Result;
            throw new Exception(msg);
    }
 }
于 2012-08-24T16:17:04.790 回答
2

从响应中获取异常时,我考虑了一些逻辑。

这使得提取异常、内部异常、内部异常 :) 等变得非常容易

public static class HttpResponseMessageExtension
{
    public static async Task<ExceptionResponse> ExceptionResponse(this HttpResponseMessage httpResponseMessage)
    {
        string responseContent = await httpResponseMessage.Content.ReadAsStringAsync();
        ExceptionResponse exceptionResponse = JsonConvert.DeserializeObject<ExceptionResponse>(responseContent);
        return exceptionResponse;
    }
}

public class ExceptionResponse
{
    public string Message { get; set; }
    public string ExceptionMessage { get; set; }
    public string ExceptionType { get; set; }
    public string StackTrace { get; set; }
    public ExceptionResponse InnerException { get; set; }
}

有关完整的讨论,请参阅此博客文章

于 2016-08-04T23:41:50.527 回答
0

自定义错误消息将位于响应的“正文”中。

于 2012-08-24T06:13:15.013 回答