Question

J'ai été coincé sur ce week-end et a lamentablement échoué!
S'il vous plaît aidez-moi à récupérer ma santé mentale !!

Votre défi

Pour ma première application Silverlight Je pensais que ce serait amusant d'utiliser le World of Warcraft Armurerie à la liste des personnages de ma guilde. Cela consiste à faire une asyncronous de Silverlight (duh!) À l'Armurerie WoW qui est basé sur XML. SIMPLE EH?

Jetez un oeil à ce lien et ouvrir la source. Vous verrez ce que je veux dire: http://eu.wowarmory.com/guild-info.xml? r = Eonar & n = Doué et talentueux

Voici le code pour obtenir le XML (l'appel à ShowGuildies va faire face à XML retourné - je l'ai testé localement et je sais que cela fonctionne).

Je n'ai pas réussi à obtenir le retour XML attendu du tout.

Notes:

  • Si le navigateur est capable de transformer le XML, il le fera, sinon HTML sera fourni. Je pense qu'il examine la UserAgent
  • Je suis un développeur web asp.net assaisonné C # donc aller facile si vous commencez à parler natif de Windows Forms / WPF
  • Je ne peux pas sembler régler le paramètre UserAgent dans .net 4.0 - ne semble pas être une propriété de l'objet HttpWebRequest pour une raison quelconque -. Je pense qu'elle était disponible
  • Silverlight 4.0 (créé à l'origine 3.0 avant de mettre à jour mon installation de Silverlight à 4,0)
  • Créé en utilisant C # 4.0
  • S'il vous plaît expliquer comme si vous parlez à un développeur web et non pas une programmation appropriée lol!

Voici le code - il doit renvoyer le XML à partir du manège militaire wow

.
private void button7_Click(object sender, RoutedEventArgs e)
{
   // URL for armoury lookup
                string url = @"http://eu.wowarmory.com/guild-info.xml?r=Eonar&n=Gifted and Talented";

                // Create the web request
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);

                // Set the user agent so we are returned XML and not HTML
                //httpWebRequest.Headers["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";

                // Not sure about this dispatcher thing - it's late so i have started to guess.
                Dispatcher.BeginInvoke(delegate()
                {
                    // Call asyncronously
                    IAsyncResult asyncResult = httpWebRequest.BeginGetResponse(ReqCallback, httpWebRequest);

                    // End the response and use the result
                    using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult))
                    {
                        // Load an XML document from a stream
                        XDocument x = XDocument.Load(httpWebResponse.GetResponseStream());

                        // Basic function that will use LINQ to XML to get the list of characters.
                        ShowGuildies(x);
                    }
                });
            }

            private void ReqCallback(IAsyncResult asynchronousResult)
            {
                // Not sure what to do here - maybe update the interface?
            }

Espérons vraiment que quelqu'un là-bas peut me aider!

Merci Mucho! Dan.

PS Oui, je l'ai remarqué l'ironie au nom de la guilde:)

Était-ce utile?

La solution

D'abord, Dispatcher.BeginInvoke est nécessaire uniquement lorsque vous êtes sur un autre thread que le thread d'interface utilisateur (où tout silverlight / WPF liés arrive). Sur un événement de clic, vous êtes déjà dans le thread d'interface utilisateur donc il n'y a pas besoin de l'appeler.

En second lieu, BeginGetResponse est une opération asynchrone alors quand il a fini, il appellera une fonction de rappel sur un autre thread, ici ReqCallback. Il est dans cette méthode que vous pouvez appeler EndGetResponse. Ce modèle applique à tous les BeginX / EndX vous trouverez dans le cadre.

Cependant, puisque vous êtes dans un autre thread, vous aurez besoin d'utiliser BeginInvoke d'envoyer un retour de méthode pour le thread d'interface utilisateur.

Le code ressemblera à ceci:

private void button7_Click(object sender, RoutedEventArgs e) {
    string url = @"http://eu.wowarmory.com/guild-info.xml?r=Eonar&n=Gifted and Talented";
    HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(url);
    httpWebRequest.BeginGetResponse(ReqCallback, httpWebRequest);
}

private void ReqCallback(IAsyncResult asyncResult)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest) asyncResult.AsyncState;
    using (HttpWebResponse httpWebResponse = (HttpWebResponse) httpWebRequest.EndGetResponse(asyncResult))
    {
        XDocument x = XDocument.Load(httpWebResponse.GetResponseStream());
        Dispatcher.BeginInvoke((Action) (() => ShowGuildies(x)));
    }
}

Notez que vous pouvez également traiter le XML dans le thread et utiliser le répartiteur que renvoyer à l'interface utilisateur guilde, pour éviter le gel de l'interface utilisateur si le XML est très longue pour analyser (ne devrait pas être le cas).

Edit: Correction du code. Il vous suffit de mettre en œuvre ShowGuildies. En ce qui concerne la connectivité Internet et des retards, puisque l'opération se produit dans un autre thread de l'interface utilisateur ne gèle pas. Vous pourriez envisager de montrer une animation de chargement ou de quelque chose de bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top