2015-08-23 3 views
4

J'utilise System.Net.WebRequest pour obtenir des informations à partir de certaines API. Lorsque j'obtiens une erreur, la réponse contient uniquement le HttpStatusCode de base et le message, et non l'erreur complète renvoyée. Pour comparaison, l'exécution des mêmes données de publication et des en-têtes dans un outil tel que POSTMAN renvoie l'erreur complète de cette API.Obtention du corps de réponse complet à partir de System.Net.WebRequest

Je me demande s'il existe une propriété ou une façon dont je peux obtenir la réponse d'erreur complète?

Voici le code que je suis en cours d'exécution:

public HttpStatusCode GetRestResponse(
    string verb, 
    string requestUrl, 
    string userName, 
    string password, 
    out string receiveContent, 
    string postContent = null) 
{ 
    var request = (HttpWebRequest)WebRequest.Create(requestUrl); 
    request.Method = verb; 

    if (!string.IsNullOrEmpty(userName)) 
    { 
     string authInfo = string.Format("{0}:{1}", userName, password); 
     authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
     request.Headers.Add("Authorization", "Basic " + authInfo); 
    } 

    if (!string.IsNullOrEmpty(postContent)) 
    { 
     byte[] byteArray = Encoding.UTF8.GetBytes(postContent); 
     request.ContentType = "application/json; charset=utf-8"; 
     request.ContentLength = byteArray.Length; 
     var dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 
    } 

    try 
    { 
     using (WebResponse response = request.GetResponse()) 
     { 
      var responseStream = response.GetResponseStream(); 
      if (responseStream != null) 
      { 
       var reader = new StreamReader(responseStream); 
       receiveContent = reader.ReadToEnd(); 
       reader.Close(); 

       return ((HttpWebResponse) response).StatusCode; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     receiveContent = string.Format("{0}\n{1}\nposted content = \n{2}", ex, ex.Message, postContent); 
     return HttpStatusCode.BadRequest; 
    } 

    receiveContent = null; 
    return 0; 
} 

Quand je produis une demande qui me présente avec une erreur, je reçois dans le message d'erreur: The remote server returned an error: (400) Bad Request. et pas InnerException, et rien d'autre que je peux bénéficier de l'exception.

[Réponse] @Rene a souligné la bonne direction et le corps de la réponse appropriée peut être acquis comme celui-ci:

var reader = new StreamReader(ex.Response.GetResponseStream()); 
var content = reader.ReadToEnd(); 

Répondre

3

Vous êtes attraper l'exception générique donc il n'y a pas beaucoup de place pour des informations spécifiques.

Vous devez attraper le specialized exception qui est jeté par les diverses classes WebRequest, à savoir WebException

Votre code de capture pourrait ressembler à ceci:

catch (WebException e) 
{ 
    var response = ((HttpWebResponse)e.Response); 
    var someheader = response.Headers["X-API-ERROR"]; 
    // check header 
    var content = response.GetResponseStream(); 
    // check the content if needed 

    if (e.Status == WebExceptionStatus.ProtocolError) 
    { 
     // protocol errors find the statuscode in the Response 
     // the enum statuscode can be cast to an int. 
     int code = (int) ((HttpWebResponse)e.Response).StatusCode; 
     // do what ever you want to store and return to your callers 
    } 
} 

Dans le cas WebException vous avez également accès à la Response envoyer à partir de l'hôte, de sorte que vous pouvez atteindre tout ce qui est envoyé à vous.

+0

C'était en fait la prise avant que je commence à l'ingérer. Je ne vois toujours pas comment j'obtiens la réponse spécifique à l'API de cette façon. J'ai cherché l'objet et recherché à nouveau et ne trouve rien de pertinent – AlexD

+0

J'ai ajouté comment vous pouvez inspecter les autres choses. Peut-être que vous pourriez partager ce que montrent les postiers, afin que je comprenne ce que vous cherchez. – rene

+0

Voici la réponse que je reçois dans POSTMAN: http://pastebin.com/uDRDesd7 et voici la collection d'en-têtes: http://pastebin.com/FVzd7kWS – AlexD