martes, 2 de diciembre de 2008

Consumiendo un WCF Service desde Silverlight

El día de hoy hablaré de como consumir un WCF Service. E intentare resolver todos y cada uno de los errores que suelen ocurrir al momento de desarrollar el ejemplo que propongo.

Aunque pareciera algo trivial este ejemplo, lo cierto es que no todo es como se ve en los webcast, libros y conferencias. A veces surgen errores que no son comunes pero nos quitan mucho tiempo al momento de toparnos con ellos.


El ejemplo que propongo hoy, se trata de una simple calculadora que recibe un número y calcula su cuadrado, es decir X2.


Primero que nada, creamos el proyecto Silverlight que será el cliente del WCF service, junto con la pagina de prueba que utilizaremos para invocar el archivo .xap generado por el proyecto de Silverlight.
clip_image002
clip_image004
Agregamos un poco de código, cabe mencionar que pueden descargar el código de aquí.
clip_image006
Y ahora ejecutamos nuestra página de prueba que invoca el objeto Silverlight que acabamos de crear. Y entonces encontramos el primer problema a resolver:
clip_image008
Para fines de desarrollo este problema es de muy fácil resolución. Basta con que se cambie la propiedad “Copy Local” del ensamblado System.Web.Silverlight a “True”
clip_image010
clip_image012
Ahora Escribimos el código correspondiente al WCF Service
clip_image014
Una vez que el servicio está listo para ser ejecutado, debemos detenernos a revisar algunas implicaciones propias de trabajar con Silverlight.

1. Se debe cambiar el tipo de Binding que utiliza el servicio porque Silverlight no soporta el tipo de binding wsHttpBinding, el tipo de binding por defecto, por lo que debe ser cambiado por basicHttpBinding.

clip_image016
2. Cuando trabajamos con WCF Services y Silverlight, las llamadas siempre son usando el modelo asíncrono.
clip_image018
Una vez que tenemos presente estas importantes consideraciones, agregamos la referencia a nuestro servicio, desde el proyecto Silverlight
clip_image020
Agregamos el código necesario para llamar al servicio en el momento que el usuario quiera calcular el cuadrado de un número x. Compilamos y ejecutamos nuestra aplicación ASP.NET demo.
clip_image022
De nuevo nos encontramos con un error en el momento de realizar la solicitud al servicio.
Soporte para peticiones “Cross Domain”
Este es el momento para hablar acerca de dos archivos que debemos conocer para desarrollar con estas tecnologías.


CrossDomain.xml

Este archivo debe estar en el directorio raíz de donde se hostea nuestra aplicación, en este caso, nuestra aplicación aun no está instalada en ningún servidor web, así que basta con que sea agregado en la carpeta en que se encuentra nuestro servicio
La sintaxis de este archivo, básicamente indica los dominios desde los cuales se pueden realizar peticiones hacia nuestra página, en este caso el WCF Service.


<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
 <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>


clip_image024
Sin embargo este archivo es viejo, desde los primeros días de Macromedia Flash, tal vez el porqué de que no sea totalmente soportado por Silverlight cuando se quiere hacer uso más a detalle del mismo, puesto que no cubre todos los escenarios. En su lugar Microsoft propone el siguiente archivo, que es de uso mas amplio.

ClientAccessPolicy.xml

Si lo que queremos es un control mas fino de cada uno de los detalles del acceso “Cross Domain” deberíamos usar el archivo ClientAccessPolicy.xml, tiene una estructura semejante al anterior pero con un mayor espectro de escenarios cubiertos.

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
 <cross-domain-access>
  <policy>
   <allow-from>
    <domain uri="*"/>
   </allow-from>
   <grant-to>
    <resource path="/" include-subpaths="true"/>
   </grant-to>
  </policy>
 </cross-domain-access>
</access-policy>

Por último tenemos el código completo para llamar a nuestro servicio.

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Documents;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media.Animation;
 using System.Windows.Shapes;
 using System.Globalization;

 namespace SilverlightApplicationDemo
 {
     public partial class Page : UserControl
     {
         public Page()
         {
             InitializeComponent();
         }

         private void CallService(double number)
         {
             CalculatorProxy.CalculatorClient client = new SilverlightApplicationDemo.CalculatorProxy.CalculatorClient();
             client.SquareCompleted += new EventHandler<SilverlightApplicationDemo.CalculatorProxy.SquareCompletedEventArgs>(client_SquareCompleted);
             client.SquareAsync(number);
         }

         void client_SquareCompleted(object sender, SilverlightApplicationDemo.CalculatorProxy.SquareCompletedEventArgs e)
         {
             if (e.Error != null)
             {
                 MessageBox.Show('El servicio devolvio un error');
                 return;
             }
             txtResult.Text = e.Result.ToString(CultureInfo.CurrentUICulture);
         }

         private void Button_Click(object sender, RoutedEventArgs e)
         {
             double number = 0;
             if (Double.TryParse(txtNumber.Text, out number) == false)
             {
                 MessageBox.Show('Esto no es un número');
                 return;
             }
             CallService(number);
         }
     }
 }
Espero que este post les sea de utilidad y que les ahorre tiempo en sus futuros desarrollos.


Happy Coding!

Etiquetas

SharePoint 2010 (38) Microsoft (32) Desarrollo SharePoint (31) Gerardo Reyes Ortiz (27) SharePoint (20) SharePoint 2013 (18) Errores SharePoint (12) México (10) PowerShell (9) Silverlight (8) Visio Services (7) Features (6) MVP (6) Silverlight 3 (6) WebCast (6) Workflows (6) Configuracion SharePoint 2010 (5) D.F. (5) API REST (4) Configuracion SharePoint 2010; (4) Troubleshooting (4) Visual Studio 2010 (4) Visual studio (4) WSS (4) Web parts (4) Apps (3) Comunidad SharePoint (3) Configuración SharePoint 2013 (3) ODATA (3) SharePoint Server (3) SharePoint; Instalación SharePoint; Troubleshooting; Search Service (3) Silverlight 3.0 (3) Silverlight Toolkit (3) WebParts (3) javascript (3) jquery (3) Eventos SharePoint (2) Office 2010 (2) PeoplePicker (2) REST (2) SQL Server (2) Scripting (2) Search Service Application (2) SharePoint Designer (2) UPA (2) UPS (2) Workflows SharePoint (2) host header (2) Apps Development (1) Big Bang (1) CAS (1) CSOM (1) Codeplex (1) CompartiMOSS (1) Configuracion SharePoint 2010; Errores SharePoint (1) Configuracion SharePoint 2010; SharePoint 2010 (1) Custom Actions (1) Custom Editor Parts (1) Delegate Controls (1) Deployment (1) DisableLoopbackCheck (1) Document Library (1) Entrevista (1) Examenes de Certificación (1) Extract WSP (1) FBA (1) FS4SP (1) Fakes (1) Fast Search Server 2010 For SharePoint (1) Fiddler (1) HTTP.SYS (1) HTTPS (1) JSON (1) Language Pack's (1) Latam (1) MAXDOP (1) MCSM (1) MSExpertos (1) MVC (1) Microsoft México (1) Microsoft; Codeplex; Screencast; (1) My Sites (1) SQL Server 2012 (1) SQL Server Reporting Services (1) Screencast (1) Screencast; (1) Service Applications (1) Service Pack (1) SharePoint 2007 (1) SharePoint 2010 SP 1 (1) SharePoint API (1) SharePoint Conference (1) SharePoint Emulators (1) SharePoint Farm (1) SharePoint Health Analyzer (1) SharePoint Magazine (1) SharePoint Online (1) SharePoint Search (1) SharePoint Test (1) SharePoint; Desarrollo SharePoint (1) Shims (1) Simposio (1) Simposio Latinoamericano (1) SkyDrive Pro (1) Soporte Microsoft (1) Templates (1) Tip (1) VSeWSS (1) Virtual Machine (1) Visual Studio 2012 (1) WCF (1) WSS; IIS 7 (1) Web API (1) Web Content Management (1) Web Services (1) Windows 8 (1) Windows Live ID (1) Xml (1) appcmd (1) iOS (1) jqGrid (1) onload function (1)