[XNA] Conectando a un servicio web desde XNA 4.0 con Windows Phone 7

Conectarnos a un servicio web desde nuestros juegos puede ser útil, por ejemplo para recoger información de cuanta gente juega, desde donde, cuando… entre otras cosas que se nos puedan ocurrir. Lo malo es que desde XNA, en Windows Phone, no podemos utilizar referencias web. Bueno, de hecho sí se podría… añadiendo una DLL de Silverlight a la solución, añadirle la referencia al servicio, referenciar este proyecto desde el juego y instanciar el proxy del webservice… pero da un warning muy feo, y no se si este pequeño «hack» tendrá cabida en el Marketplace. Así que la forma elegante de hacerlo es mediante los webrequest de toda la vida.

Para empezar la prueba lo primero que necesitaremos es un webservice al que conectarnos. Para ello yo me he creado un WebService de toda la vida con VS2008 y lo he colgado en mi IIS local, de manera que esta es la URL de mi servicio: http://localhost/service/service1.asmx. El servicio contiene el método HelloWorld que viene creado por defecto en cualquier servicio que hagamos con Visual Studio, que devuelve un simple string: «Hola mundo!!!». Asumiendo que todos sabemos crear un webservice como este, vamos a ver como recuperar sus datos desde el teléfono.

En el método Initialize de cualquier proyecto XNA, en la clase Game, instanciaremos un objeto HttpWebRequest y haremos un post. Observad que el post se realiza asíncronamente con BeginGetResponse, y es que en XNA para Phone no hay otra… no lo podemos hacer síncronamente. En esta llamada asíncrona se pasan como parámetros primero Response_Completed, que es el método que se llamará cuando termine el Response, y el objeto httpWebRequest, que es el que queremos recuperar en este método.

        protected override void Initialize()
        {
            string webServiceAddress = @»http://localhost/service/service1.asmx«;           
            string methodName = «HelloWorld»;

            string webServiceMethodUri = string.Format(«{0}/{1}», webServiceAddress, methodName);

            HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(webServiceMethodUri);
            httpWebRequest.Method = «POST»;

            httpWebRequest.BeginGetResponse(Response_Completed, httpWebRequest);
           
            base.Initialize();
        }

 Y esta sería la implementación del método Response_Completed. lo más interesante es que tenemos que parsear el XML resultante. Esto podría hacerse mediante una serialización / deserialización de XML en objetos, y nos ahorraríamos tener que hacer el parseo a mano, pero como ejemplo sencillo esto nos vale.

       void Response_Completed(IAsyncResult result)
        {
            HttpWebRequest request = (HttpWebRequest)result.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

            using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
            {
                string xml = streamReader.ReadToEnd();

                using(XmlReader reader = XmlReader.Create(new StringReader(xml)))
                {
                    reader.MoveToContent();
                    reader.GetAttribute(0);
                    reader.MoveToContent();

                    this.mensaje = reader.ReadInnerXml();
                }
            }
        }

Y ya sólo queda pintar el mensaje que hemos obtenido en pantalla… este código es trivial:

       protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();
            spriteBatch.DrawString(fuente, this.mensaje, new Vector2(30.0f, 40.0f), Color.Black);
            spriteBatch.End();

            base.Draw(gameTime);
        }

 El resultado de la ejecución sería el siguiente:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *