2011-09-30 40 views
34

Facebook API Api를 사용하고 있으며 사용자 데이터를 가져 오려고합니다. 나는이 토큰이 만료되었거나 유효 페이스 북이 상태 코드 (400)이 응답을 반환 토큰 및 사례에 대한 사용자 액세스를 보내고있다 :.NET에서 WebException ((400) Bad Request를 throw 할 때 WebResponse를 처리하는 방법)?

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

문제는 그 나는이 C# 코드를 사용할 때 :

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

을 상태 코드가 400이면 .NET 예외가 잡히면 WebException을 throw하고 webResponsenull이므로 처리 할 기회가 없습니다. 문제가 만료 된 토큰과 다른 곳이 아닌지 확인하려고합니다.

할 방법이 있습니까?

감사합니다.

답변

72

이 같은 try/catch 블록을 사용하여 오류 메시지가 적절하게 잘 작동합니다 처리 : 당신이 자신을이를 처리하지 않도록 Facebook C# SDK이 모두 정말 쉽게 사용

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

을하지만 .

+0

자세한 답변을 주셔서 감사합니다. 나는 비슷한 방식으로 alredy를 작성했습니다. 페이스 북 SDK를 사용할 수는 있지만 페이스 북 API를 사용하는 것은 구글이나 트위터와 비교할 때 상대적으로 쉽습니다. 그래서 여기에서 모든 것을 수동으로하고 흐름을 이해하고 더 많은 제어를하기로 결정했습니다. – Burjua

+0

Silverlight에서 WebException -> errorResponse.GetResponseStream()이 null 인 이유는 누구나 아는 사람입니까? Fiddler에서 신체 반응을 볼 수 있습니다. –

+0

그것은 나에게도 null입니다. 조금 파고있어. 이 정상적인 .net 컴파일 할 때 예상대로 작동합니다. –

14

WebExceptionResponse 속성에 여전히 "실제"응답을 가지고 있으므로 (응답이 있다고 가정하면) catch 블록 내의 데이터를 가져올 수 있습니다.

+0

Jon, 거기에'Response' 속성에 액세스하는 것이 좋은 생각입니까? catch 블록 안에 예외가 생기면 어떻게 될까요? 나는'try and catch'를 다른'try and catch' 안에 넣어야합니까? – Burjua

+0

@ Burjua : 속성에 액세스하면 예외가 발생하지 않습니다. 결국 그 속성이 그대로 유지됩니다. 응답에는 이미 모든 응답 데이터가 포함되어 있으므로 응답 스트림 자체를 읽는 것은 관리하는 경우 안전해야합니다. –