Asincrono Silverlight 4 chiamata alla World of Warcraft armeria in streaming XML in C #
-
04-10-2019 - |
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:)
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ò.