2011-09-30 19 views
34

Używam Facebooka Graph Api i próbuję uzyskać dane użytkownika. Wysyłam token dostępu użytkownika oraz w przypadku tokena jest nieważna Facebook zwraca kod statusu 400 i tej odpowiedzi:Jak przetwarzać WebResponse, gdy .NET generuje wyjątek WebException ((400) Bad Request)?

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

Problemem jest to, że podczas korzystania z tego kodu C#:

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

Jeśli kod stanu to 400.NET generuje wyjątek WebException, a mój webResponse jest null po tym, jak zostanie przechwycony wyjątek, więc nie mam szansy go przetworzyć. Chcę to zrobić, aby upewnić się, że problem jest w toku wygasłego, a nie gdzie indziej.

Czy jest jakiś sposób na zrobienie tego?

Dzięki.

Odpowiedz

72

Korzystanie z bloku try/catch i przetwarzania takiego komunikatu o błędzie odpowiednio powinny działać prawidłowo:

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

Jednak użycie Facebook C# SDK sprawia, że ​​to wszystko bardzo proste, dzięki czemu nie trzeba przetwarzać ten sam .

+0

Dzięki za szczegółową odpowiedź, zrobiłem to alredy w podobny sposób. Wiem, że mogę korzystać z Facebook SDK, ale korzystanie z Facebooka jest stosunkowo łatwe w porównaniu z Google lub Twitter, więc postanowiłem zrobić wszystko ręcznie, aby zrozumieć przepływ i mieć większą kontrolę. – Burjua

+0

Ktoś wie, dlaczego wyjątek WebException -> errorResponse.GetResponseStream() ma wartość null w programie Silverlight? Widzę jednak reakcję ciała w Skrzypku. –

+0

Dla mnie też nie ma. Robię trochę kopania. Działa to zgodnie z oczekiwaniami po skompilowaniu w normalnym .net. –

14

Ciąg dalszy ma "rzeczywistą" odpowiedź w obiekcie (zakładając, że w ogóle była odpowiedź), więc można uzyskać dane z tego bloku catch.

+0

Dziękuję Jon, czy to jest dobry pomysł, aby spróbować uzyskać dostęp do właściwości 'Response'? co się stanie, jeśli otrzymam wyjątek w bloku 'catch'? czy powinienem umieścić moje 'try and catch' wewnątrz innego' try and catch'? – Burjua

+0

@Burjua: Uzyskanie dostępu do nieruchomości nie da wyjątku - w końcu to jest jego przeznaczenie. Ja * wierzę *, że odpowiedź będzie zawierała już wszystkie dane odpowiedzi, więc samo przeczytanie strumienia odpowiedzi powinno być bezpieczne, jeśli uda się je zdobyć. –