我正在使用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”始终为“Not found”,对于500个代码为“Internal Server Error”。
有什么想法吗?如何从Web API发回自定义错误消息,同时保持正常返回类型为我的域对象?
答案 0 :(得分:14)
(把我的答案放在这里以便更好地格式化)
是的我看到了它,但是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);
}
}
答案 1 :(得分: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; }
}
有关完整讨论,请参阅this blog post。
答案 2 :(得分:0)
自定义错误消息将位于响应的“正文”中。