Windows Phone 8 y servicios WCF

Introducción

Hoy día contamos con una gran cantidad de posibilidades para abastecer a nuestra aplicación de información, ASP.net WebAPI, Azure, etc. Sin embargo, los “clásicos” nunca mueren. WCF sigue siendo una opción perfecta para trabajar con aplicaciones móviles.

WCF son las siglas de Windows Communication Foundation. Es una tecnología Microsoft que nos permite crear servicios accesibles desde internet pudiendo ser consumidos desde aplicaciones Windows Phone u otras plataformas.

El emulador de Windows Phone 8. Problemas de conexión

Cuando creamos un servicio web en Visual Studio por defecto el servicio es hospedado en IIS Express y acepta conexiones sólo de http://localhost/. Cuando desarrollabamos una aplicación bajo Windows Phone 7 e intentábamos  conectar con un servicio WCF se podía conectar sin problemas con el servicio ya que el emulador utiliza la misma red que la máquina de desarrollo.

Sin embargo, al intentar realizar la misma operación bajo el emulador de Windows Phone 8, siempre nos topamos con un error que nos indica que no se encuentra el servicio.

¿Porque?

Recordar que el emulador de Windows Phone 8 es una máquina virtual en Hyper-V y utiliza su propia red independiente de la red de la máquina de desarrollo.

Antes de conectar con el servicio desde el emulador de Windows Phone 8 debemos hacer pequeños cambios:

  • Hay que volver a configurar el servidor web para aceptar conexiones desde otros dispositivos de la red.
  • Hay que volver a configurar la referencia al servicio en la aplicación Windows Phone para conectarse al servicio mediante la dirección IP del equipo de desarrollo (donde se está ejecutando el servicio WCF).

Bien, vamos a crear una aplicación de ejemplo donde vamos a verificar el problema comentado y por supuesto buscar la solución al mismo. Creamos un nuevo proyecto:

Aplicación Windows Phone

Tras crear el proyecto Windows Phone 8, vamos a crear un segundo proyecto (bajo la misma solución) WCF.

Seleccionamos la plantilla “WCF Service Application”:

Aplicación WCF

Aplicación WCF

De modo que la estructura de nuestra solución en estos momentos sería algo como lo siguiente:

Estructura proyecto

Estructura proyecto

Nos centramos en el proyecto WCF. Hacemos clic derecho sobre el proyecto y nos centramos en la pestaña “Web”:

IIS Express

IIS Express

Como podemos observar el servicio utilizará IIS Express como lugar para hospedarse y la URL localhost. Generamos ya el proyecto WCF para poder añadirlo como referencia de servicio en nuestro proyecto Windows Phone 8.

Si hacemos clic derecho sobre el archivo Service1.svc y seleccionamos “Ver en el Navegador” veremos algo como lo siguiente:
Service1
El navegador abre y muestra una página que nos indica que el servicio web funciona correctamente y que está disponible.

Nos centramos a continuación en el proyecto Windows Phone 8.Vamos a añadir la referencia al servicio WCF. Hacemos clic derecho sobre las referencias del proyecto y seleccionamos “Añadir referencia de servicio”:

Referencia servicio WCF

Referencia servicio WCF

El servicio WCF que se crea por defecto tiene un simple método que recibe un entero como parámetro y devuelve una cadena. Vamos a modificar la página de nuestro proyecto Windows Phone para poder mostrar el valor devuelto por el servicio. Añadimos dentro del Grid ContentPanel:

<TextBlock x:Name="tbResultadoWCF" Width="400" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap" FontSize="72"/>

Nos centramos en el code-behind (MainPage.xaml.cs) donde vamos a realizar la llamada al servicio:

private void TestWCF()
{
     int value = 7;

     ServiceReference1.Service1Client service1 = new ServiceReference1.Service1Client();
     service1.GetDataCompleted += new EventHandler<ServiceReference1.GetDataCompletedEventArgs>(TestCallback);
     service1.GetDataAsync(value);
}

El evento GetDataCompleted recibirá el resultado y se lo asignaremos al TextBlock creada en la interfaz:

private void TestCallback(object sender, ServiceReference1.GetDataCompletedEventArgs e)
{
     tbResultadoWCF.Text = e.Result;
}

Llamamaos al servicio en el constructor:

// Constructor
public MainPage()
{
     InitializeComponent();

     TestWCF();
}

Todo listo!. Pulsamos F5 y ejecutamos la aplicación en el emulador. Tras ejecutarse la aplicación y esperar unos leves segundos (tiempo que tardará el programa en llamar al servicio) y…

The remote server returned an error: NotFound.

The remote server returned an error: NotFound.

Error!. Si vemos los detalles del error:

The remote server returned an error: NotFound.

Ya sabemos porque. El emulador de Windows Phone 8 es una máquina virtual en Hyper-V y la red de la misma es distinta a la de la máquina de desarrollo.

La solución. Cambiar configuraciones

Para resolver el problema causado por la dirección localhost debemos reconfigurar el servicio web e IIS Express para aceptar conexiones de otros dispositivos. Estos dispositivos conectarán con el servicio utilizando la IP de la máquina de desarrollo.

Ya hemos mencionado que vamos a utilizar la IP de la máquina de desarrollo. Abre el símbolo del sistema en la máquina de desarrollo y escribe:

ipconfig

Esta línea de comando nos facilitará la dirección IP de la máquina. Vamos a modificar el archivo de configuración de IIS Express que lo podéis encontrar en la ruta:

%USERPROFILE%\<your user name>\Documents\IISExpress\config\

El nombre del fichero es applicationhost.config. Lo abrimos y buscamos la sección <sites>. Buscamos el sitio que tenga el nombre de nuestro servicio y nos fijamos en el apartado <bindings>.

Tenemos un binding ya establecido a localhost que no podemos eliminar. Por lo tanto, añadimos un segundo binding igual al ya creado reemplazando localhost por la IP de la máquina de desarrollo. La sección de bindings quedará:

<bindings>
     <binding protocol="http" bindingInformation="*:1618:localhost" />
     <binding protocol="http" bindingInformation="*:1618:192.168.1.243" />
</bindings>

Guardamos los cambios. Cerramos Visual Studio y lo volvemos a ejecutar con privilegios de Administrador (es necesario para registrar nuestra aplicación con un servicio no alojado en localhost). Ejecutamos la aplicación. Se arrancará IIS Express. Hacemos clic derecho sobre ISS Express y seleccionamos la opción “Mostrar todas las aplicaciones”:

ISS Express Sitios

ISS Express Sitios

Ya casi estamos. Hemos realizado gran parte del  del trabajo. A continuación, debemos eliminar la referencia al servicio de nuestra aplicación Windows Phone 8 y añadir de nuevo la referencia sustituyendo localhost por la IP de la máquina de desarrollo.

Por último, vamos a añadir en el Firewall de Windows una excepción para IIS Express en el puerto que estámos utilizando.

Testing

Todo listo. Pulsa F5 para ejecutar la aplicación en el emulador. El emulador arrancará y tras unos segundos mostrará un texto que habrá devuelto el servicio WCF . Por lo tanto hemos conectado con éxito con el mismo.

Servicio funcionando

Servicio funcionando

2 pensamientos en “Windows Phone 8 y servicios WCF

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s