2011-09-30 55 views
34

Estoy usando Facebook Graph Api y tratando de obtener datos de usuario. Estoy enviando el acceso del usuario símbolo y en caso de que este token ha caducado o Facebook no válido devuelve el código de estado 400 y esta respuesta:Cómo procesar WebResponse cuando .NET lanza WebException ((400) Bad Request)?

{ 
    "error": { 
     "message": "Error validating access token: The session is invalid because the user logged out.", 
     "type": "OAuthException" 
    } 
} 

El problema es que cuando se utiliza el código C#:

try { 
    webResponse = webRequest.GetResponse(); // in case of status code 400 .NET throws WebException here 
} catch (WebException ex) { 
} 

Si el código de estado es 400 .NET arroja WebException y mi webResponse es null después de que se detecta una excepción, por lo que no tengo la oportunidad de procesarlo. Quiero hacerlo para asegurarme de que el problema esté en el token caducado y no en otro lugar.

¿Hay una manera de hacerlo?

Gracias.

Respuesta

72

El uso de un bloque try/catch como esta y procesar el mensaje de error apropiada debería funcionar bien:

var request = (HttpWebRequest)WebRequest.Create(address); 
    try { 
     using (var response = request.GetResponse() as HttpWebResponse) { 
      if (request.HaveResponse && response != null) { 
       using (var reader = new StreamReader(response.GetResponseStream())) { 
        string result = reader.ReadToEnd(); 
       } 
      } 
     } 
    } 
    catch (WebException wex) { 
     if (wex.Response != null) { 
      using (var errorResponse = (HttpWebResponse)wex.Response) { 
       using (var reader = new StreamReader(errorResponse.GetResponseStream())) { 
        string error = reader.ReadToEnd(); 
        //TODO: use JSON.net to parse this string and look at the error message 
       } 
      } 
     } 
    } 
} 

Sin embargo, el uso de la Facebook C# SDK hace que esto sea muy fácil para que usted no tiene que procesar esto por sí mismo .

+0

Gracias por la respuesta detallada, ya lo hice de una manera similar. Sé que podría usar Facebook SDK, pero usar la API de Facebook es relativamente fácil en comparación con Google o Twitter, así que decidí hacer todo manualmente aquí para comprender el flujo y tener más control. – Burjua

+0

¿Alguien sabe por qué WebException -> errorResponse.GetResponseStream() es nulo en Silverlight? Aunque puedo ver la respuesta del cuerpo en Fiddler. –

+0

Es nulo para mí también. Haciendo un poco de excavación. Esto funciona como se espera cuando se compila en .net normal. –

14

WebException todavía tiene la respuesta "real" en la propiedad Response (suponiendo que haya una respuesta) para que pueda obtener los datos de eso dentro del bloque catch.

+0

Gracias Jon, ¿es una buena idea intentar acceder a la propiedad 'Response' allí? ¿Qué pasará si recibo una excepción dentro del bloque 'catch'? ¿Debo poner mi 'try and catch' dentro de otro' try and catch'? – Burjua

+0

@Burjua: Acceder a la propiedad no le dará una excepción, después de todo, eso es lo que está ahí. Creo * que la respuesta ya contendrá todos los datos de respuesta, por lo que leer la secuencia de respuesta en sí debería ser segura si logras adquirirla. –

Cuestiones relacionadas