我使用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代码。 该“ReasonPhrase”始终是“未找到” 404,或“内部服务器错误” 500码。
有任何想法吗? 如何从Web API发回的自定义错误信息,同时保持正常返回类型为我的域对象?
(这里把我的答案更好的格式化)
是的,我看到了它,但HttpResponseMessage没有一个身体属性。 我想通了自己: 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);
}
}
敛从响应该异常时,我分解出来的一些逻辑。
这使得它非常容易提取异常,内部异常,内部异常:)等
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; }
}
对于一个完整的讨论,请参阅此博客文章 。