web-dev-qa-db-ja.com

.NETがWebException((400)Bad Request)をスローしたときにWebResponseを処理する方法は?

Facebook Graph Apiを使用して、ユーザーデータを取得しようとしています。ユーザーアクセストークンを送信していますが、このトークンの有効期限が切れているか、無効な場合、Facebookはステータスコード400とこの応答を返します。

{
    "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になるため、処理する機会がありません。問題が期限切れトークンにあり、他の場所にないことを確認するために、それを行いたいと思います。

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

ありがとう。

36
Burjua

次のようなtry/catchブロックを使用し、エラーメッセージを適切に処理することで問題なく動作します。

    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 を使用すると、このすべてが非常に簡単になるため、これを自分で処理する必要はありません。

86
bkaid

WebExceptionResponse プロパティにはまだ「実際の」応答があり(応答があったとして)、catchブロック内のデータを取得できます。

14
Jon Skeet