cómo consumir wcf services en silverlight 4

10
CARRERA DE SISTEMAS E INFORMATICA TALLER DE CERTIFICACION DE VISUAL STUDIO 2010 Profesor del Curso : Raul Solis Mendiola I. OBJETIVO Crear una aplicación con Silverlight Cómo consumir WCF Services en Silverlight 4 usando ADO.NET En esta entrada veremos algo un poco mas completo para trabajar con Silverlight, veremos como consumir un WCF Service desde Silverlight 4 usando ADO.NET y SQL como fuente de datos. Antes de iniciar con esta entrada es necesario tener en nuestro servidor de SQL Server la base de datos Northwind a la cual haremos referencia en este ejemplo Para iniciar crearemos un proyecto de Silverlight 4 en Visual Studio 2010 como se muestra en la siguiente imagen: Nota:

Upload: angel-guerrero

Post on 28-Apr-2015

151 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Cómo consumir WCF Services en Silverlight 4

CARRERA DE SISTEMAS E INFORMATICATALLER DE CERTIFICACION DE VISUAL STUDIO 2010

Profesor del Curso : Raul Solis Mendiola

I. OBJETIVO

Crear una aplicación con Silverlight

Cómo consumir WCF Services en Silverlight4 usando ADO.NETEn esta entrada veremos algo un poco mas completo para trabajar con Silverlight,veremos como consumir un WCF Service desde Silverlight 4 usando ADO.NET y SQLcomo fuente de datos.

Antes de iniciar con esta entrada es necesario tener en nuestro servidor de SQL Serverla base de datos Northwind a la cual haremos referencia en este ejemplo Para iniciarcrearemos un proyecto de Silverlight 4 en Visual Studio 2010 como se muestra en lasiguiente imagen:

Nota:

Page 2: Cómo consumir WCF Services en Silverlight 4

Seleccionaremos la opción que nos agrega un proyecto Web a nuestra solución la cualutilizaremos para hospedar nuestra aplicación de Silverlight como se muestra en lasiguiente imagen:

Después de esto agregaremos otro proyecto a nuestra solución de librería de clases conel nombre de ClassLibrary1 en el cual agregaremos dos archivos de código, el primerocon el nombre de Categoria.vb y el segundo con el nombre de CategoriaDAL.vb el cualserá nuestra capa de acceso a datos, definiremos nuestra clase dentro del archivoCategoria.vb con tres propiedades; IDCategoria, Nombre y Descripcion como semuestra a continuación:

01 Public Class Categoria0203 Private intIDCategoria As Integer04 Private strNombre As String05 Private strDescripcion As String0607 Public Property IDCategoria() As Integer08 Get09 Return Me.intIDCategoria10 End Get11 Set(ByVal value As Integer)12 Me.intIDCategoria = value13 End Set

Page 3: Cómo consumir WCF Services en Silverlight 4

14 End Property1516 Public Property Nombre() As String17 Get18 Return Me.strNombre19 End Get20 Set(ByVal value As String)21 Me.strNombre = value22 End Set23 End Property2425 Public Property Descripcion() As String26 Get27 Return Me.strDescripcion28 End Get29 Set(ByVal value As String)30 Me.strDescripcion = value31 End Set32 End Property333435 End Class

En nuestra clase CategoriaDAL agregaremos una función con el nombre deObtenerListaCategorias() que nos retornara una lista de tipo Categoria la cual hará unaconsulta a nuestra base de datos Northwind a nuestra tabla Categories y regresara unalista de objetos de la clase Categoría.Para ejecutar esta consulta crearemos una instancia de nuestra clase SqlConnection lacual le pasaremos como parámetro al inicializar la clase nuestra cadena de conexión,para tener un poco mas de información sobre cadenas de conexión ir aquí.Crearemos un objeto de la clase SqlCommand Class el cual ejecutara nuestra consultade SQL y crearemos un objeto de la clase SqlDataReader Class que será el lector dedatos que usaremos para barrer el resultado de nuestra consulta la cual asignaremoscada campo a la propiedad de la clase correspondiente y retornaremos la lista de objetosde la clase Categoria como se muestra a continuación:

01 Imports System.Data02 Imports System.Data.SqlClient0304 Public Class CategoriaDAL0506 Public [Error] As String0708 Public Function ObtenerListaCategorias() As List(Of Categoria)

09 Dim conSQLConnexion As New SqlConnection("DataSource=SERVIDOR1;Initial Catalog=Northwind;Persist Security

Page 4: Cómo consumir WCF Services en Silverlight 4

Info=True;User ID=user;Password=pass123")

10Dim cmdSQLComando As New SqlCommand("select CategoryID,

CategoryName, Description from Categories order by CategoryID",conSQLConnexion)

11 cmdSQLComando.CommandTimeout = 200012 cmdSQLComando.CommandType = Data.CommandType.Text13 Dim ldSQLLectorDatos As SqlDataReader14 Dim lsListaCategorias As New List(Of Categoria)15 Try16 conSQLConnexion.Open()17 ldSQLLectorDatos = cmdSQLComando.ExecuteReader()18 Do While ldSQLLectorDatos.Read()19 Dim cCategoria As New Categoria20 cCategoria.IDCategoria =

Convert.ToInt32(ldSQLLectorDatos("CategoryID"))

21 cCategoria.Nombre =Convert.ToString(ldSQLLectorDatos("CategoryName"))

22 cCategoria.Descripcion =Convert.ToString(ldSQLLectorDatos("Description"))

23 lsListaCategorias.Add(cCategoria)24 Loop25 ldSQLLectorDatos.Close()26 Catch ex As SqlException27 Me.Error = ex.Message.ToString()28 Finally29 conSQLConnexion.Close()30 conSQLConnexion.Dispose()31 End Try32 Return lsListaCategorias33 End Function3435 End Class

Nota: Es necesario agregar las referencias a nuestros ensamblados System.Data y

System.Data.SqlClient en nuestro proyecto de librería de clases (ClassLibrary1).

Después de esto agregaremos otro proyecto a la solución de tipo WCF Servicetecnología la cual pertenece a nuestro NET Framework que nos proporciona un modelode programación unificado para la creación de aplicaciones orientadas a servicios, a esteproyecto le asignaremos el nombre de WCFServices1 en el cual agregaremos un nuevoservicio WCF con el nombre de CategoriaServicio.svc.

Al crear nuestro proyecto de servicios WCF hay que definir un contrato, pero ¿que esesto?, un contrato especifica que operaciones se admiten en el servicio, los contratos secrean mediante la definición de una interfaz de servicio, es decir nuestro contrato seestablece entre nuestro servicio y nuestra interfaz en la cual definiremos nuestrasfunciones las cuales deberán de estar especificadas en ambas partes.

Page 5: Cómo consumir WCF Services en Silverlight 4

Después de esta explicación es necesario agregar a nuestro proyecto WCFServices1 lareferencia a nuestro proyecto ClassLibrary1, esto dando clic sobre nuestro proyectoWCFServices1 en la opción de agregar referencia.

Agregaremos la misma función que en nuestra ClaseDAL con el nombre deObtenerListaCategorias() en nuestra interfaz:

01 Imports System.ServiceModel02 Imports ClassLibrary10304 <ServiceContract()>05 Public Interface ICategoriaServicio0607 <OperationContract()>08 Function ObtenerListaCategorias() As List(Of Categoria)0910 End Interface

En nuestro servicio crearemos nuestra función que implemente de nuestra interfaz ycrearemos dentro una instancia de nuestra clase CategoriaDAL y ejecutaremos nuestrafunción:

01 Imports ClassLibrary10203 Public Class CategoriaServicio04 Implements ICategoriaServicio

Page 6: Cómo consumir WCF Services en Silverlight 4

05

06 Function ObtenerListaCategorias() As List(Of Categoria)Implements ICategoriaServicio.ObtenerListaCategorias

07 Dim cCategoriaDAL As New CategoriaDAL08 Return cCategoriaDAL.ObtenerListaCategorias()09 End Function1011 End Class

Nota: Es necesario generar nuestro proyecto WCFService1 al llegar a este punto, dando

clic derecho sobre el mismo en la opción de Volver a generar.

Agregaremos referencia en nuestro proyecto de Silverlight a nuestro servicioCategoriaServicio.svc dando clic derecho sobre el nombre de nuestro proyectoWCFServices1 en la opción de Agregar referencia de servicio como se muestra en lassiguiente imagen:

Page 7: Cómo consumir WCF Services en Silverlight 4

Agregaremos la referencia con el nombre de CategoriaServicio como se muestra en lasiguiente imagen:

Hasta este momento los proyectos en nuestra solución deberán verse como en lasiguiente imagen:

Page 8: Cómo consumir WCF Services en Silverlight 4

Agregaremos en nuestra pagina MainPage.xaml un DataGrid con el nombre deDgrCategorias y un Botón con el nombre de BtnCargarDatos e importaremos en nuestraclase MainPage dentro del archivo MainPage.xaml.vb la referencia a nuestro servicio yagregaremos tambien el evento BtnCargarDatos_Click del boton que agregamospreviamente en nuestra pagina.

Al momento de agregar la referencia a nuestro servicio se crea un archivo con elnombre de Reference.vb el cual contiene nuestras clases, funciones y eventos, dichoarchivo no esta visible pero es posible verlo directamente desde la ruta donde tenemosnuestra solución en el proyecto de Silverlight, esto se explicara en alguna entrada futura.

Agregaremos el método ObtenerListaCategorias() el cual mandaremos llamar desde elevento BtnCargarDatos_Click de nuestro botón y agregaremos también el eventoObtenerListaCategoriasCompleted() , este evento nos servirá para obtener los datosretornados por nuestra función, en nuestro evento ObtenerListaCategorias() crearemosel cliente para ejecutar la función de nuestro servicio, como se muestra a continuación:

1 Private Sub ObtenerListaCategorias()2 Dim cscCategoriaServicioCliente As New CategoriaServicioClient

3AddHandler

cscCategoriaServicioCliente.ObtenerListaCategoriasCompleted,AddressOf ObtenerListaCategoriasCompleted

4 cscCategoriaServicioCliente.ObtenerListaCategoriasAsync()

Page 9: Cómo consumir WCF Services en Silverlight 4

5 cscCategoriaServicioCliente.CloseAsync()6 End Sub

En nuestro metodo ObtenerListaCategoriasCompleted() obtendremos el resultado denuestra función ejecutada en el metodo ObtenerListaCategorias() este será el patrón deuso que se vera cada vez que se tiene acceso a servicios con Silverlight, dicho resultadolo asignaremos como ItemSource de nuestro DataGrid:

1 Private Sub ObtenerListaCategoriasCompleted(ByVal sender As Object,ByVal e As ObtenerListaCategoriasCompletedEventArgs)

2 If e.Error Is Nothing Then3 If e.Result IsNot Nothing Then4 Me.DgrCategorias.ItemsSource = e.Result5 End If6 Else7 ' Mensaje de error8 End If9 End Sub

Hasta este momento si ejecutamos nuestro proyecto veremos que nos estará marcando elsiguiente error:

{System.ServiceModel.CommunicationException: Se ha producido un error al intentarrealizar una solicitud al URI ‘http://localhost:9228/CategoriaServicio.svc&#8217;.Puede deberse a un intento de acceso a un servicio de configuración entre dominios sinuna política entre dominios adecuada en contexto o una política no apropiada paraservicios SOAP. Es posible que necesite ponerse en contacto con el propietario delservicio para publicar un archivo de política entre dominios y para asegurarse de quepermite enviar encabezados HTTP relacionados con SOAP.

Para solucionar este problema agregaremos un nuevo archivo XML a nuestro proyectoWCFService1 con el nombre de ClientAccessPolicy.xml el cual le agregaremos elsiguiente esquema ya que por cuestiones de seguridad en Silverlight 4 es necesarioespecificar una política de acceso del cliente:

01 <?xml version="1.0" encoding="utf-8"?>02 <access-policy>03 <cross-domain-access>04 <policy>05 <allow-from http-request-headers="*">06 <domain uri="*"/>07 </allow-from>08 <grant-to>09 <resource path="/" include-subpaths="true"/>10 </grant-to>11 </policy>12 </cross-domain-access>13 </access-policy>

Page 10: Cómo consumir WCF Services en Silverlight 4

Después de agregar el archivo ClientAccessPolicy.xml y ejecutar nuestro proyectonuestro DataGrid deberá de verse de la siguiente manera: