Pregunta

he estado atascado en este fin de semana y fracasado estrepitosamente
Por favor, ayúdame a recuperar parte de mi cordura !!

Su reto

Para mi primera aplicación de Silverlight pensé que sería divertido de usar el Mundo de Armería a la lista de los personajes en mi gremio. Esto implica hacer una asyncronous de Silverlight (la!) Al arsenal de WoW que es basado en XML. SIMPLE EH?

Tome un vistazo a este enlace y abrir la fuente. Usted verá lo que quiero decir: http://eu.wowarmory.com/guild-info.xml? r = Eonar y n = Dotados y Talentosos

A continuación se muestra el código para obtener el código XML (la llamada a ShowGuildies va a hacer frente a la XML devuelto - He probado esto localmente y sé que funciona).

No han logrado obtener el XML devuelto esperaba en absoluto.

Notas:

  • Si el navegador es capaz de transformar el XML lo hará, de lo contrario será proporcionado HTML. Creo que examina el agente de usuario
  • Soy un desarrollador web sazonado asp.net C #, así que ir fácil si se empieza a hablar de nativos de Windows Forms / WPF
  • Me parece que no puede establecer la configuración de agente de usuario en .NET 4.0 - no parece ser una propiedad del objeto HttpWebRequest por alguna razón -. Creo que lo que solía ser disponible
  • Silverlight 4.0 (3.0 creado como originalmente antes de que actualicé mi instalación de Silverlight a 4,0)
  • Creado usando C # 4.0
  • Por favor, explique como si hablar con un desarrollador web y no una adecuada programación lol!

A continuación se muestra el código - que debe devolver el XML desde el wow arsenal

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

Realmente espero que alguien por ahí me puede ayudar!

Gracias Mucho! Dan.

PS Sí, he notado la ironía en el nombre de la Alianza:)

¿Fue útil?

Solución

En primer lugar, Dispatcher.BeginInvoke sólo se necesita cuando estás en otro hilo que el hilo de interfaz de usuario (donde todo Silverlight / WPF relacionada sucede). En un evento de clic, ya se encuentra en el hilo de interfaz de usuario así que no hay necesidad de llamar a él.

En segundo lugar, BeginGetResponse es una operación asíncrona por lo que cuando se ha terminado, será llamar a una función de devolución de llamada en el otro hilo, aquí ReqCallback. Es en este método que se puede llamar EndGetResponse. Este patrón se aplica a todos los BeginX / EndX que encontrará en el marco.

Sin embargo, ya que estás en otro hilo, tendrá que utilizar BeginInvoke para enviar una copia de método para el hilo de interfaz de usuario.

El código se vería así:

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

Tenga en cuenta que también se puede procesar el XML en el hilo y utilizar el despachador sólo para enviar de vuelta compañeros del clan de la interfaz de usuario, para evitar la congelación de la interfaz de usuario si el XML es mucho tiempo para análisis sintáctico (no debería ser el caso).

Editar Se ha corregido el código. Sólo hay que poner en práctica ShowGuildies. En cuanto a la conectividad a Internet y los retrasos, ya que se produce la operación en otro hilo la interfaz de usuario no se congele. Es posible que tenga en cuenta mostrar una animación de carga o algo sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top