2011-09-30 10 views
34

Sto usando Facebook Graph Api e sto cercando di ottenere i dati dell'utente. Sto inviando l'accesso degli utenti token e nel caso in cui questo token è scaduto o non valido Facebook restituisce il codice di stato 400 e questa risposta:Come elaborare WebResponse quando .NET lancia WebException ((400) Richiesta non valida)?

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

Il problema è che quando uso questo codice C#:

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

Se il codice di stato è 400, .NET esegue WebException e il mio webResponse è null dopo che è stata rilevata un'eccezione, quindi non ho alcuna possibilità di elaborarla. Voglio farlo per assicurarmi che il problema sia nel token scaduto e non altrove.

C'è un modo per farlo?

Grazie.

risposta

72

utilizzo di un blocco try/catch come questo e l'elaborazione del messaggio di errore in modo appropriato dovrebbe funzionare bene:

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

Tuttavia, utilizzando il Facebook C# SDK rende tutto questo molto semplice in modo che non c'è bisogno di elaborare da soli .

+0

Grazie per la risposta dettagliata, l'ho già fatto in un modo simile. So che potrei usare Facebook SDK, ma usare Facebook api è relativamente facile rispetto a Google o Twitter, quindi ho deciso di fare tutto manualmente qui per capire il flusso e avere più controllo. – Burjua

+0

Qualcuno sa perché WebException -> errorResponse.GetResponseStream() è nullo in Silverlight? Tuttavia, posso vedere la risposta del corpo in Fiddler. –

+0

Anche per me è nullo. Facendo un po 'di scavo. Funziona come previsto quando è compilato in .net normale. –

14

Il WebException ha ancora la risposta "reale" nella proprietà Response (supponendo che ci sia stata una risposta) in modo da poter ottenere i dati da quello all'interno del blocco catch.

+0

Grazie Jon, è una buona idea provare ad accedere alla proprietà 'Response' lì? cosa succederà se ottengo un'eccezione all'interno del blocco 'catch'? dovrei mettere il mio 'try and catch' in un altro' try and catch'? – Burjua

+0

@Burjua: l'accesso alla proprietà non ti darà un'eccezione, dopotutto è così. Io * credo * che la risposta contenga già tutti i dati di risposta, quindi leggere il flusso di risposta stesso dovrebbe essere sicuro se riesci ad acquisirlo. –