Tutorial de Silverlight 2 con WCF

16 05 2008

Hola, les comparto un tutorial en donde utilizo las siguientes tecnologías:

  • ASP.NET 3.5
  • Silverlight 2 Beta 1
  • Expression Blend 2.5
  • WCF
  • LINQ
  • Expression Web

Antes que nada tenemos que tener instalado el Visual Studio 2008 y las extensiones de Silverlight 2 Beta 1, y expression Blend 2.5, eso lo pueden encontrar aquí

a) Iniciamos en Visual Studio 2008, Creamos un nuevo proyecto de tipo Silverlight:

silverlight2_tutorial01

b) Después nos aparece una ventana en donde escogemos la opción de tipo proyecto:

silverlight2_tutorial02

c) Nos crea el proyecto, escogemos el Page.xaml y le damos clic derecho abrir con Expression Blend :

silverlight2_tutorial03

d) Cambiamos el fondo en Expression Blend

silverlight2_tutorial04

e) Agregaremos un Rectangulo y lo agruparemos dentro de un StackPanel y le daremos un Color de Fondo:

silverlight2_tutorial05

F) Agregamos un control desde el Asset Library, el cual se llama WatermarkedTextBox,

silverlight2_tutorial06 silverlight2_tutorial07

g) Agregamos un boton, quedando de esta forma:

silverlight2_tutorial08

Guardemos y volvemos a Visual Studio 2008, le damos que Si a Todo.

silverlight2_tutorial09

Agregamos un nuevo elemento al proyecto Web que tenemos,en este caso será un dataContext que es propio del nuevo control de acceso a datos LINQ, escogemos LINQ to SQL Clases y colocamos el nombre de ” datos.dbml “.

silverlight2_tutorial10

Al dar agregar nos crea el diseñador visual, y le damos clic en Server Explorer, nos abre el explorador de servidores y damos en nueva conexión,

silverlight2_tutorial11

Selecciono la base de datos Northwind que si no la tienen pueden descargarla de aquí

Depues, selecciono las tablas de Categorias y Productos, las arrastro al diseñador visual de LINQ.

silverlight2_tutorial12

Quedando de esta forma, con sus relaciones:

silverlight2_tutorial13

Escogemos que el dataContext tenga en el modo de Serialización que sea Unidireccional.

silverlight2_tutorial14

Agregamos un nuevo elemento al proyecto, en este caso será un servicio de WCF.

silverlight2_tutorial15

En este caso, coloco una lista de la clase Productos, que en este caso me refiero a la tabla, y pido como parametro una variable de tipo string, en donde indicará la categoría del Producto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace TutorialSilverlight2_Web
{
    [ServiceContract]
    public interface ImiServicio
    {
        [OperationContract]
        List<Product> ObtenerProductos(string NombreCategoria);
    }
}

 

Depues este buscamos el archivo de codigo del web service:

silverlight2_tutorial16

Borramos el metodo DoWork, que nos quede de tal forma así:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace TutorialSilverlight2_Web
{
    public class miServicio : ImiServicio
    {
    }
}

Ahora vamos a implementar nuestro servicio cual haya sido el nombre que ustedes le pusieron, dando clic en la I, de la interfaz:

silverlight2_tutorial17

#region ImiServicio Members

      public List<Product> ObtenerProductos(string NombreCategoria)
      {
      }

#endregion

Ahora, crearemos una variable de tipo DataContext.

var miDataContext = new datosDataContext();

Codificamos nuestra consulta de LINQ, que consiste en traernos a todos los productos del dataContext segun la categoría que le metamos como parámetro.

var miConsulta = from p in miDataContext.Products
                            where p.Category.CategoryName.Contains(NombreCategoria)
                            select p;

Retornaremos la consulta en forma de Lista de esta forma:

return miConsulta.ToList();

Quedando finalmente así:

public List<Product> ObtenerProductos(string NombreCategoria)
       {
           var miDataContext = new datosDataContext();
           var miConsulta = from p in miDataContext.Products
                            where p.Category.CategoryName.Contains(NombreCategoria)
                            select p;

           return miConsulta.ToList();
       }

Nos vamos al webconfig y le cambiamos al atributo binding del tag services, de wsHttpBinding a basicHttpBinding:

 silverlight2_tutorial18

Esto con el fin de activar solo el modo básico al llamar a mi webservice desde la aplicación que lo solicitará.

silverlight2_tutorial19

Nos vamos ahora al proyecto y agregamos referencias Web, del servicio que acabamos de hacer:

 

 silverlight2_tutorial20

silverlight2_tutorial21

Ahora agregaremos una referencia, que será la de System.Windows.Controls.Data, ya que colocaré un datagrid dentro de la aplicación Silverlight:

silverlight2_tutorial22

Ahora agregaremos ese referencia en el código XAML:

silverlight2_tutorial23

Después localizamos el control watermarkedTexBox y le colocamos un nombre:

<WatermarkedTextBox x:Name=”txtCategoria”  …../>

Nos vamos a Expression Blend 2.5 y agregamos un nuevo control que será un datagrid:

silverlight2_tutorial25

Nos vamos a Visual studio 2008 y en el tag del datagrid vamos a añadir los siguientes atributos:

x:Name=”Mostrar” AutoGenerateColumns=”True”

Después añadimos el evento click al boton:

silverlight2_tutorial24

Nos vamos al evento clic del botón:

private void Button_Click(object sender, RoutedEventArgs e)
        {

        }

  Agrego a los namespaces la referencia:

using TutorialSilverlight2.ServiceReference1;

Dentro del evento clic copiamos esto:

var proxy=new ServiceReference1.ImiServicioClient();
            proxy.ObtenerProductosAsync(txtCategoria.Text);

 Despues vamos a crear el siguiente metodo:

silverlight2_tutorial26

Quedando de esta forma:

private void Button_Click(object sender, RoutedEventArgs e)
      {
          var proxy=new ServiceReference1.ImiServicioClient();
          proxy.ObtenerProductosCompleted += new EventHandler<ObtenerProductosCompletedEventArgs>(proxy_ObtenerProductosCompleted);
          proxy.ObtenerProductosAsync(txtCategoria);

      }

      void proxy_ObtenerProductosCompleted(object sender, ObtenerProductosCompletedEventArgs e)
      {
      }

Ahora dentro del metodo que creamos colocaremos:

void proxy_ObtenerProductosCompleted(object sender, ObtenerProductosCompletedEventArgs e)
        {
            Mostrar.ItemsSource = e.Result;
        }

  Y damos visualizar o F5 :D

silverlight2_tutorial27

Saludos… Si quieren el proyecto completo, me dicen, para colocar la liga de descarga… Nos vemos en el proximo tutorial.


Acciones

Información

7 respuestas

16 05 2008
Maricruz

Completo y entendible.

Gracias.

Saludos.

24 05 2008
Héctor Hernández

Que tal… muchas gracias por este post… lo estuve siguiendo pero precisamente en la parte en la que tratas de agregar la referencia de tu servicio el proyecto de Silverligth me marca un error. Me indica “The type ‘TutorialSilverlight2_Web.miServicio’, provided as the Service attribute value in the ServiceHost directive could not be found. Encontré algunos post en línea sobre este problema pero indican que son de la configuración del sitio en ISS7. La cuestión aquí es que no estamos sobre IIS7 sino sobre el VS… así que no tengo idea de por dónde solucionar este problema. Seguí tu tutorial al pie de la letrad hasta quedar atorado en ese punto. Me encantaría que pudieras darme una pista de por dónde llegar a la solución. De nuevo gracias por tu tutorial, ha sido bastante ilustrativo. Saludos. P.D. ¿podrías publicar el archivo con el proyecto completo por favor?

24 05 2008
24 05 2008
mredison

Dejame checar por que de ese error, vale…

25 05 2008
Héctor Hernández

Perfecto, muchas gracias… yo mientras tanto veré las diferencias en los archivos entre tu proyecto y el mío. En serio muchas gracias de nuevo.

9 06 2008
Carlos de Luna Saenz

Esta interesante, pero lo que estoy ahorita buscando es una simple respuesta a una pregunta que puede parecer muy tonta… para el cliente del WCF que va a ser utilizado por mi aplicación silverlight o xbap… ¿Que nombre debería tener el archivo de configuración de WCF?, actualmente tengo una aplicación que ya me trabaja bien en WPF y está empezando a trabajar para xbap, el archivo de configuración en la versión stand alone es IUS.exe.config ya que el ejecutable de mi app es ius.exe, para la version xbap dentro de un ambiente de debug parecia funcionar bien el IUSWeb.exe.config (ya que el proyecto varia para no producir un Window, sino un Page, todo lo demás es lo mismo)… pero cuando lo publico me marca que no puede encontrar la definición de mi endpoint -indicador de que no está encontrando el archivo de configuración-.
¿Alguna idea?
Saludos

18 03 2009
JuanMi

Hola! muy útil estoy empezando ahora con SilverLight y he utilizado este tutorial para crear mi propia aplicación y bueno mi pregunta es la siguiente:

Tengo 2 combos y para cargarlos utilizo el servicio WCF pero sólo detecta un sólo método y no 3 como quisiera yo:

Primer combo: carga una lista de provincias.

Segundo combo: carga una lista de hospitales.

Y un tercer metodo sería un método sobrecargado de la lista de hospitales al que le paso un parámetro para obtener solo los hospitales en el segundo combo de la provincia seleccionada en el primero.

¿Cómo podría un único servicio para los 3 (o más) métodos?

Un saludo desde España y enhorabuena por estos post!

Deja un comentario