2012-08-24 9 views
6

Sto utilizzando HttpClient per chiamare il mio MV Web di MVC 4. Nella mia chiamata API Web, restituisce un oggetto dominio. Se qualcosa va storto, un HttpResponseException verrà lanciato sul server, con un messaggio personalizzato.HttpClient non segnala l'eccezione restituita dall'API Web

[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; 
    } 

È possibile visualizzare il messaggio di errore personalizzato nel corpo della risposta utilizzando IE F12. Tuttavia quando lo chiamo usando HttpClient, non ottengo il messaggio di errore personalizzato, solo il codice http. "ReasonPhrase" è sempre "Not found" per 404 o "Internal Server Error" per 500 codici.

Qualche idea? Come posso rispedire il messaggio di errore personalizzato dall'API Web, pur mantenendo il normale tipo di reso come oggetto di dominio?

+0

Quale server Web si sta utilizzando, IIS o server Web ASP.NET? –

+0

Sto usando IIS su Win 2008 R2. Ancora una volta, è ok quando lo chiamo utilizzando un browser. – Calvin

risposta

14

(Mettendo la mia risposta qui per la formattazione meglio)

Sì ho visto, ma HttpResponseMessage non ha una proprietà del corpo. L'ho capito da solo: response.Content.ReadAsStringAsync().Result;. Il codice di esempio:

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); 
    } 
} 
+4

Si dovrebbe essere cauti nel richiamare 'Result' direttamente da' ReadAsAsync 'perché ciò può causare problemi di thread intermittenti. Invece, prova: 'var contentTask = response.Create.ReadAsAsync ();' seguito da 'contentTask.Wait();' e quindi 'return contentTask.Result;' –

+0

Grazie per il suggerimento! – Calvin

+2

@Sixto: puoi descrivere i problemi di threading? I documenti [Risultato] (http://msdn.microsoft.com/en-us/library/vstudio/dd321468 (v = vs.110) .aspx) dicono "L'accesso get per questa proprietà assicura che l'operazione asincrona sia completa prima di tornare. " Sembra che una chiamata a 'Wait' sia incorporata. –

0

Il messaggio di errore personalizzato si trova nel "corpo" della risposta.

+0

Sì, l'ho visto ma HttpResponseMessage non ha una proprietà body. L'ho capito da solo: 'response.Content.ReadAsStringAsync(). Risultato;'. Il codice di esempio: public T GetService (string requestUri) { HttpResponseMessage response = _client.GetAsync (requestUri) .Result; if (response.IsSuccessStatusCode) { return response.Content.ReadAsAsync () .Result; } else { string msg = response.Consent.ReadAsStringAsync(). Risultato; lanciare una nuova eccezione (msg); } } – Calvin

+0

In realtà per corpo, intendevo il contenuto della risposta. –

1

Ho preso in considerazione parte della logica quando ho catturato l'eccezione da una risposta.

questo lo rende molto facile per estrarre l'eccezione, eccezione interna, eccezione interna :), ecc

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; } 
} 

Per una descrizione completa vedere this blog post.

Problemi correlati