Подтвердить что ты не робот

Как обрабатывать WebResponse, когда .NET выдает WebException ((400) Bad Request)?

Я использую Facebook Graph Api и пытаюсь получить пользовательские данные. Я отправляю токен доступа пользователя, и если этот токен истек или недействителен, Facebook возвращает код состояния 400 и этот ответ:

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

Проблема в том, что когда я использую этот код С#:

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

Если код состояния 400.NET выбрасывает WebException, а мой webResponse - null после того, как исключение поймано, поэтому у меня нет возможности его обработать. Я хочу сделать это, чтобы убедиться, что проблема в истекшем токене, а не где-то еще.

Есть ли способ сделать это?

Спасибо.

4b9b3361

Ответ 1

Использование блока 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 С# SDK делает все это очень простым, так что вам не придется обрабатывать это самостоятельно.

Ответ 2

WebException все еще имеет "реальный" ответ в свойстве Response (при условии, что был ответ вообще), поэтому вы может получить данные из этого в блоке catch.