Domanda

Sono stato bloccato su questo tutto il weekend e fallito miseramente!
Ti prego, aiutami a recuperare la mia sanità mentale !!

La vostra sfida

Per la mia prima applicazione Silverlight ho pensato che sarebbe stato divertente per usare il World of Warcraft Armory per elencare i personaggi nella mia gilda. Si tratta di fare un asincrono da Silverlight (duh!) Al WoW armeria, che è basato su XML. SEMPLICE EH?

Date un'occhiata a questo link e aprire l'origine. Vedrete cosa intendo: http://eu.wowarmory.com/guild-info.xml? r = Eonar & n = Gifted e di talento

Di seguito è riportato il codice per ottenere l'XML (la chiamata a ShowGuildies farà fronte con l'XML restituito - Ho testato questo a livello locale e so che funziona).

Io non sono riusciti a ottenere l'XML restituito atteso a tutti.

Note:

  • Se il browser è in grado di trasformare l'XML lo farà, altrimenti sarà fornito HTML. Penso che esamina l'UserAgent
  • Sono un stagionato asp.net web developer C # in modo da andare facile se si comincia a parlare di nativo di Windows Form / WPF
  • Non riesco a impostare l'impostazione UserAgent in .net 4.0 - non sembra essere una proprietà fuori l'oggetto HttpWebRequest per qualche motivo -. Penso che usato per essere disponibile
  • Silverlight 4.0 (creato come 3.0 in origine, prima ho aggiornato il mio installazione di Silverlight a 4,0)
  • Creato utilizzando C # 4.0
  • Si prega di spiegare come se a parlare con uno sviluppatore web e non una vera e propria programmazione lol!

Di seguito è riportato il codice - deve restituire l'XML dal wow armeria

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

Spero davvero che qualcuno là fuori mi può aiutare!

Grazie Mucho! Dan.

PS Sì, ho notato l'ironia nel nome della gilda:)

È stato utile?

Soluzione

In primo luogo, Dispatcher.BeginInvoke è necessaria solo quando sei in un altro thread del thread UI (dove tutto Silverlight / WPF accade correlati). Su un evento click, sei già nel thread UI quindi non c'è bisogno di chiamarlo.

Secondo, BeginGetResponse è un'operazione asincrona così quando ha finito, si chiamerà una funzione di richiamata su un altro thread, qui ReqCallback. E 'in questo metodo che è possibile chiamare EndGetResponse. Questo modello si applica ad ogni BeginX / EndX troverete nel quadro.

Tuttavia, dal momento che siete in un altro thread, è necessario utilizzare BeginInvoke di inviare un metodo nuovo al thread dell'interfaccia utente.

Il codice sarà simile a questa:

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

Si noti che è anche possibile elaborare l'XML nel thread e utilizzare il dispatcher solo per inviare di nuovo compagni di gilda per l'interfaccia utente, per evitare il congelamento l'interfaccia utente se l'XML è molto lungo per analizzare (non dovrebbe essere il caso).

Modifica Corretto il codice. Basta implementare ShowGuildies. Per quanto riguarda la connettività internet e ritardi, in quanto l'operazione avviene in un altro thread l'interfaccia utente non si blocca. Si potrebbe considerare che mostra un'animazione di carico o qualcosa però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top