web-dev-qa-db-fra.com

Comment traiter WebResponse lorsque .NET lève WebException ((400) Bad Request)?

J'utilise Facebook Graph Api et j'essaie d'obtenir des données utilisateur. J'envoie un jeton d'accès utilisateur et si ce jeton est expiré ou invalide, Facebook renvoie le code d'état 400 et cette réponse:

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

Le problème est que lorsque j'utilise ce code C #:

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

Si le code d'état est 400 .NET, lance WebException et mon webResponse est null après que l'exception a été interceptée, donc je n'ai aucune chance de le traiter. Je veux le faire pour m'assurer que le problème est dans le jeton expiré et pas ailleurs.

Y a-t-il un moyen de le faire?

Merci.

36
Burjua

L'utilisation d'un bloc try/catch comme celui-ci et le traitement approprié du message d'erreur devraient fonctionner correctement:

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

Cependant, l'utilisation du Facebook C # SDK rend tout cela très facile afin que vous n'ayez pas à le traiter vous-même.

86
bkaid

Le WebException a toujours la "vraie" réponse dans la propriété Response (en supposant qu'il y ait eu une réponse) afin que vous puissiez obtenir les données de cela dans le catch block.

14
Jon Skeet