.NET Tutorial 60: Como crear un servicio web y usarlo desde Windows Phone

Hace un par de días Btc me comentaba sobre la posibilidad de que una aplicación de Windows Phone se comunicase con una base de datos de SQL que estaba hospedada en un hosting.

Realizar este tipo de tareas es relativamente sencillo usando servicios web y WCF (Windows Communication Foundation).

El ejemplo que os mostraré hoy se divide en 3 proyectos:

1) El proyecto que accede a la base de datos. Este proyecto será una dll

2) El servicio web basado en WCF que permitirá a otras aplicaciones acceder a la base de datos. Este servicio tendrá como referencia la dll de 1) y se hospedará en un hosting

3) Aplicación de ejemplo, en este caso una aplicación de Windows Phone desde la cual se podrá "manipular" la base de datos mediante el servicio web de 2)

 

Paso previo. Crear la base de datos/tabla

Lo primero que vamos a crear es una base de datos en nuestro servidor, en este caso SQL Server. En nuestro ejemplo crearemos la siguiente tabla:

 

El campo id es un campo autonumérico.

La idea es tener una tabla de "puntuaciones" que se podrá actualizar desde una aplicación de Windows Phone, utilizando para ello dos cosas:

1) La tarifa de datos de nuestro operador móvil

2) El servicio web que veremos a continuación.

Paso 1. Crear librería que accede a la base de datos

En este primer tutorial, veremos únicamente como insertar un nuevo registro en la base de datos. En posteriores tutoriales veremos como consultar la lista de puntuaciones para mostrarla en el móvil.

Pues bien, abrimos Visual Studio  y seleccionamos que queremos realizar un proyecto de biblioteca de clases:

El código de nuestra clase solo tendrá una función, a la que hemos llamado InsertarHIScore. La clase la he llamado HiScoreDAL. El código completo de la clase es este:

 

A esta función se le pasa el nombre del jugador y la puntuación y lo que devuelve es el ID dentro de nuestra base de datos una vez se ha realizado la insercción del registro.

Como se observa, se está llamando a otra clase, llamada DALCore, que es la encargada de acceder realmente a la base de datos. 

Esta clase es la que tiene implementados los métodos que crean (Insert), actualizan (Update), borran (Delete) o seleccionan (Select) los registros de la base de datos.

El código completo de la clase DALCore lo podéis ver aquí 

Como véis en el código, básicamente lo único que hay es una funcón que inserta el un registro en la base de datos y recupera el ID de dicha insercción:

 

Compilamos la librería y obtenemos una dll que usaremos a continuación.

 

Paso 2. Crear servicio web basado en WCF

Ya bien sea dentro de la solución anterior o como solución nueva, ahora creamos un proyecto de tipo Aplicación de servicio web:

Una vez creado este nuevo proyecto, lo primero que deberemos hacer es añadir la referencia a la dll que creamos en el punto 1). Para ello, botón derecho sobre el proyecto y seleccionamos agregar referencia. 

Bien, la plantilla de "Aplicación de servicios WCF" nos genera un interfaz (IService1.cs) con unos métodos de ejemplo y una clase (Service1.svc) con la implementación de dicha interfaz

En nuestro caso borraremos los métodos de ejemplo del interfaz del archivo IService1.cs y dejaremos únicamente este código:

 

Ahora en la clase del servicio Service1.svc implementaremos el interfaz de esta forma:
(Nota: en la clase, acordaros de hacer referencia a la dll del punto 1) ya bien sea con un using (C#) o con un Imports (VB.NET)

Bien, el servicio lo tenemos ya casi listo pero falta modificar un par de cosas.

Si accedemos al archivo Web.config del servicio veremos que tenemos una sección denominada   <system.serviceModel> donde se definen las características del servicio:

En mi caso particular, voy a cambiar el "binding" que por defecto es WsHttpBinding por basicHttpBindig. Para ello modificamos está linea en el Web.config:

<endpoint address="" binding="WsHttpBinding" contract="WCFSrvHIScores.IService1"> 

y la cambiaremos por esta:  

<endpoint address="" binding="basicHttpBinding" contract="WCFSrvHIScores.IService1"> 

Además, tengo que añadir toda esta sección dentro de <system.serviceModel> ya que sino mi hostsing no admite el servicio:

<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://www.midireccion.com/hiscores:8000"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment> 

Con lo que al final el archivo Web.config tiene este aspecto en lo referente a la sección <system.serviceModel>:

 

Compilamos el servicio y lo subimos a nuestro hosting. Ya estamos listos para el último paso.

 

Paso 3. Crear aplicación que utilice el servicio web

Una vez que ya tenemos nuestro servicio web en marcha, es hora de utilizarlo. Para ello vamos a realizar una aplicación de Windows Phone que básicamente permitirá insertar una nueva puntuación en la base de datos.

Básicamente lo que tenemos son un par de textbox, unos textblocks y un botón.

El mecanismo es el siguiente: Se introduce el nombre y la puntuación en los textbox y al pulsar en el botón se guarda esta información en la base de datos. 

El XAML completo del grid esta aquí.

Pues bien, una vez que tenemos el diseño, lo que deberemos hacer es agregar una referencia de servicio.

Pondremos la dirección de nuestro servicio, pulsaremos en Ir y al cabo de unos segundos veremos lo siguiente: 

 

Como se observa, se ha recuperado la función de definimos en nuestra clase original, InsertarHIScore

En nuestro código básicamente lo que tenemos que hacer es esto:

ServiceReference1.Service1Client mHIScore = new ServiceReference1.Service1Client();

mHIScore.InsertarHIScoreCompleted += new EventHandler<ServiceReference1.InsertarHIScoreCompletedEventArgs>(mHIScore_InsertarHIScoreCompleted);

mHIScore.InsertarHIScoreAsync(TxtNombre.Text.Trim(), Int32.Parse(TxtScore.Text)); 

 

Vemos si funciona el "asunto". Lanzamos la depuración para cargar el emulador de Windows Phone:

Pulsamos en guardar los datos y vemos:

efectivamente, se informa que se ha guardado el registro en la base de datos y que el ID devuelto es 1

Vamos a comprobarlo usando el MSQL Management Studio:

y voilá, efectivamente, el registro se ha creado en la base de datos.

La base de datos está en un servidor en California (EE.UU) mientras que el teléfono está en medio del monte y se ha usado la conexión de datos móviles para insertar dicho registro en la base de datos. No está mal el invento 😀

 

Saludos.
mov eax,ollydbgInt 13h

 

Código completo ejemplo Windows Phone C# aquí
Código completo ejemplo Windows Phone VB.NET aquí.

 


Ollydbg ProSignature