2011-09-30 7 views
34

私はFacebook Graph APIを使用しており、ユーザーデータを取得しようとしています。私は、このトークンの有効期限が切れているか、または無効Facebookはステータスコード400と、このレスポンスを返すトークンとケース内のユーザーのアクセスを送っています:.NETがWebException((400)Bad Requestをスローしたときに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をスローし、webResponsenullの場合は例外がキャッチされたため、処理する機会はありません。私は問題が期限切れのトークンで、どこか他の場所にないことを確認するためにそれをしたい。

これを行う方法はありますか?

ありがとうございました。

答えて

72

:あなたはこの自分を処理する必要がないように

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

はしかし、Facebook C# SDKを使用すると、これはすべて、本当に簡単になります。

+0

詳細な回答をありがとう、私はそれを同様の方法でalredyしました。私はFacebook SDKを使うことができると知っていますが、Facebook APIを使うのはGoogleやTwitterと比較して比較的簡単ですので、ここで手動ですべてをやってフローを理解し、よりコントロールすることにしました。 – Burjua

+0

SilverlightでWebException - > errorResponse.GetResponseStream()がnullである理由は誰でも知っていますか?私はフィドラーで体反応を見ることができます。 –

+0

それは私にとってもnullです。掘り起こす通常の.netでコンパイルすると、これは期待どおりに動作します。 –

14

WebExceptionResponseプロパティに「本当の」応答を持ちます(応答があると仮定した場合)ので、catchブロック内のデータからデータを取得できます。このようなtry/catchブロックを使用すると、エラーメッセージが適切に正常に動作する必要があり、処理

+0

ありがとうございました。「応答」プロパティにアクセスしようとするとよいでしょうか? 'catch'ブロック内で例外が発生するとどうなりますか?別の 'try and catch'の中に私の' try and catch'を入れなければなりませんか? – Burjua

+0

@Burjua:プロパティにアクセスしても例外はありません。それは結局そのためのものです。レスポンスには既にすべてのレスポンスデータが含まれていると私は信じています。レスポンスストリームを読むことは、それを取得することができれば安全です。 –

関連する問題