2011-08-26 3 views

Répondre

1

Tout d'abord tout dans mes tests, je trouve que le DownloadStringCompleted fait feu.

Toutefois, une tentative de lecture de la propriété Result des arguments d'événement déclenchera une erreur. Vous devez tester la propriété Error de l'événement args pour déterminer si une erreur est survenue. Si elle a cette propriété contiendra une référence à un WebException.

Heureusement le WebException a un objet Response qui est de type WebResponse. Vous pouvez obtenir la chaîne de réponse à l'aide d'une petite fonction: -

string StringFromWebResponse(WebResponse response) 
    { 
     using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 

Mais il y a un problème. Ceci n'est disponible que si vous utilisez la pile ClientHTTP et non la pile BrowserHTTP. Donc, vous avez besoin de quelque chose comme cette ligne de code dans votre application: -

WebRequest.RegisterPrefix("https://graph.facebook.com", System.Net.Browser.WebRequestCreator.ClientHttp); 

Alors code comme ceci fonctionnera: -

 WebClient client = new WebClient(); 
     client.DownloadStringCompleted += (s, args) => 
     { 
      string result; 

      if (args.Error == null) 
      { 
       result = args.Result; 
       //Do something with the expected result 
      } 
      else 
      { 
       WebException err = args.Error as WebException; 

       result = StringFromWebResponse(err.Response); 
       // Do something with the error result 
      } 
     }; 

     client.DownloadStringAsync(new Uri("https://graph.facebook.com/me?access_token=your_token", UriKind.Absolute)); 

Oh, mais il y a peut-être un autre problème. Je ne sais rien de l'API facebook mais s'il y a une dépendance aux cookies, la pile ClientHTTP ne gère pas les cookies par défaut. Pour gérer correctement les cookies, vous devez affecter un CookieContainer commun à chaque HttpWebRequest utilisé. WebClient ne vous permet pas d'accéder à l'objet WebRequest utilisé, donc vous devrez passer directement à WebRequest/WebResponse.

+0

Le RegisterPrefix semble l'avoir fait. Pour une raison quelconque, il ne se déclencherait pas sur l'erreur 400, mais avec le préfixe. Merci pour l'aide! – Peanut

+0

@Peanut: J'ai testé sans ClientHTTP et l'événement se déclenche encore, ce serait un défaut IMO grave s'il ne tirait pas du tout. Si vous êtes en mesure de démontrer qu'il ne se déclenche pas, il serait bon que vous puissiez en créer un petit Repro et l'inclure dans la question. – AnthonyWJones

Questions connexes