Как обрабатывать 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"
    }
}

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

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

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

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

Спасибо.


person Burjua    schedule 30.09.2011    source источник


Ответы (2)


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

person bkaid    schedule 01.10.2011
comment
Спасибо за подробный ответ, уже делал аналогично. Я знаю, что могу использовать Facebook SDK, но использовать API Facebook относительно просто по сравнению с API Google или Twitter, поэтому я решил сделать все вручную здесь, чтобы понять поток и иметь больший контроль. - person Burjua; 04.10.2011
comment
Кто-нибудь знает, почему WebException - ›errorResponse.GetResponseStream () имеет значение null в Silverlight? Однако я могу видеть реакцию тела в Fiddler. - person Ismael; 21.11.2012
comment
Для меня это тоже ноль. Немного покопался. Это работает должным образом при компиляции в обычном .net. - person Ross Jones; 27.03.2013
comment
Проблема потери WebException- ›errorResponse, похоже, исходит из блока using. Следуя советам, данным в этом Как ответить (stackoverflow.com/a/1887407/1547089), если вы просто используете блок using вокруг потока, вы не потеряете errorResponse. - person ksaylor11; 22.07.2015