Windows Phone 7 y WCF

 

Introducción

Windows Phone 7 y Windows Communication Foundation forman un excelente dúo.

Debido a la gran orientación de Windows Phone 7 hacia la nube y a la falta de soporte oficial de bases de datos en el teléfono necesitamos encontrar una forma de almacenar nuestros datos fuera del dispositivo. Para esto, Windows Communication Foundation nos ofrece una plataforma segura, robusta y completa que cubrirá todas nuestras necesidades de comunicación con el exterior.

Dada la extensión y potencia de WCF a veces puede ser un poco complicado el hacer que todo funcione correctamente, con esto en mente creamos este artículo para guiaros por los pasos necesarios para llevar a buen término el uso de WCF con Windows Phone 7.

Creación del servicio

A la hora de crear servicios WCF para ser consumidos desde Windows Phone 7 no debemos tener ninguna consideración especial en cuenta, bastará con crear un servicio WCF standard, desde el menú Archivo > Nuevo > Proyecto (File > New > Project) en Visual Studio 2010 y en la pantalla de nuevo proyecto, seleccionar WCF de la lista de plantillas y WCF Service Application de los proyectos WCF disponibles.

image

 

Configuración del servicio

Una vez creado nuestro servicio WCF podremos desarrollarlo de forma normal, atendiendo a ciertas restricciones de configuración o características no soportadas actualmente por Windows Phone 7, a continuación tenemos una tabla en la que podemos ver una comparación entre el soporte de WCF que nos ofrece Windows Phone 7, y las versiones de escritorio de Silverlight (3 y 4):

Característica Versión

WP7

Silverlight 3

Silverlight 4

Bindings HTTP

X

X

X

Comunicación Duplex

 

X

X

Sindicación Rss

 

X

X

Bindings Custom

 

X

X

DataContract Serialization

X

X

X

Seguridad HTTPS

X*

X

X

JSON

 

X

X

Sockets

 

X

X

Seguridad BasicHttp

X

X

X

Proxy dinámico

 

X

X

* Solo disponible con ciertas entidades certificadoras: http://msdn.microsoft.com/en-us/library/gg521150(v=VS.92).aspx

Como podemos observar, en estos momentos Windows Phone 7 soporta las características básicas de WCF, podemos ver una descripción en profundidad del soporte que tenemos disponible para realizar servicios WCF en este enlace.

Una característica de los binding HTTP que tenemos disponible en WCF para Windows Phone 7 y es muy importante conocer es la sección ReaderQuotas. Esta sección de los binding HTTP indica los límites de tamaño bajo los que se tienen que mantener las peticiones al servicio para ser aceptadas o el tamaño máximo de un array que intentemos enviar. Por defecto el tamaño máximo de array está establecido en 16384, con lo que, por ejemplo, si intentamos enviar un array de bytes que contenga más elementos que 16384 el servicio denegará la petición.

Esta característica está pensada para proteger a nuestro servicio de un posible ataque DOS (Denial of service) que basándose en mensajes complejos intente colapsar los endpoints del servicio WCF. Debido a esto, debemos recordar siempre intentar ajustar los valores de esta sección en la medida de lo posible a los datos que vayamos a recibir, si ajustamos estos parámetros a un valor Max.Int32 estaremos eliminando esta defensa natural que tiene nuestro servicio.

Para configurar esta característica podemos usar la Herramienta de Configuración de Servicio WCF que tenemos disponible en Visual Studio 2010 en el menú Herramientas.

image

Simplemente debemos crear un nuevo binding para nuestro EndPoint y podremos ver la sección ReaderQuotas con los diferentes parámetros que debemos configurar como máximos bytes por lectura o longitud máxima de un array.

Una vez modificados los valores debemos aplicar la configuración a nuestro Endpoint:

image

Y ya solo nos queda guardar el trabajo que hemos realizado y veremos los valores reflejados en el archivo web.config de nuestro servicio:

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="NewBinding0">
          <readerQuotas
              maxDepth="128"
              maxStringContentLength="1024"
              maxArrayLength="131072"
              maxBytesPerRead="524288"
              maxNameTableCharCount="4">
          </readerQuotas>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="WcfService.Service1">
        <endpoint
              address="basichttp"
              binding="basicHttpBinding"
              bindingConfiguration="NewBinding0"
              name="basicHTTP"
              contract="WcfService.IService1">
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Con esto ya hemos visto cómo crear y configurar nuestro servicio y las restricciones que encontraremos al desarrollarlo para Windows Phone 7, el siguiente paso es conectar nuestra aplicación con nuestro servicio.

Conectando desde Windows Phone 7

El paso necesario para referenciar a un servicio WCF desde nuestra aplicación Windows Phone 7 es realmente simple.

Simplemente haremos click con el botón derecho del ratón sobre nuestro proyecto Windows Phone 7 y seleccionaremos la opción Añadir referencia a servicio (Add Service Reference)

image

 

Si el servicio WCF que deseamos referenciar se encuentra en la misma solución que nuestra aplicación, nos bastará presionar el botón Discover (Descubrir) para que en la lista de servicios aparezca el mismo. Si no es así, deberemos especificar la URL donde se encuentre el servicio WCF y presionar el botón Go (Ir).

Una vez hecho esto, solo tenemos que seleccionar el servicio, indicar el nombre de Namespace que deseamos asignarle y presionar OK para que Visual Studio 2010 se encargue de generar un proxy automáticamente para que tengamos acceso a todos los métodos y clases de nuestro servicio.

Solo tendremos que crear una instancia nueva de la clase que deseemos usar, y podremos acceder a los métodos del servicio, observaremos que el servicio expone métodos asíncronos para todos los métodos que hemos creado puesto que en Windows Phone 7 las peticiones web son asíncronas:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ServiceReference1.Service1Client proxy = new ServiceReference1.Service1Client();
            
            proxy.GetDataCompleted += new EventHandler<ServiceReference1.GetDataCompletedEventArgs>(proxy_GetDataCompleted);

            proxy.GetDataAsync(25);
        }

        void proxy_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                MessageBox.Show(e.Result.ToString());
            }
        }

Conclusión

Siguiendo los pasos citados en este artículo y leyendo los enlaces que hay a lo largo del texto podremos crear un servicio Windows Communication Foundation optimizado y una aplicación de Windows Phone 7 que haga uso del mismo de forma efectiva y sin problemas.

A continuación tenéis el código fuente completo para descargar, un saludo y Happy Coding!

Un comentario sobre “Windows Phone 7 y WCF”

Deja un comentario

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