You are on page 1of 10

Cmo consumir WCF Services en Silverlight 4 usando ADO.

NET
con 27 comentarios 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, la cual podemos descargar aqu. Para iniciar crearemos un proyecto de Silverlight 4 en Visual Studio 2010 como se muestra en la siguiente imagen:

Seleccionaremos la opcin que nos agrega un proyecto Web a nuestra solucin la cual utilizaremos para hospedar nuestra aplicacin de Silverlight como se muestra en la siguiente imagen:

Despus de esto agregaremos otro proyecto a nuestra solucin de librera de clases con el nombre de ClassLibrary1 en el cual agregaremos dos archivos de cdigo, el primero con el nombre de Categoria.vb y el segundo con el nombre de CategoriaDAL.vb el cual ser nuestra capa de acceso a datos, definiremos nuestra clase dentro del archivo Categoria.vb con tres propiedades; IDCategoria, Nombre y Descripcion como se muestra a continuacin:
01 Public Class Categoria 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 Public Property Nombre() As String Get Return Me.strNombre End Get Public Property IDCategoria() As Integer Get Return Me.intIDCategoria End Get Set(ByVal value As Integer) Me.intIDCategoria = value End Set End Property Private intIDCategoria As Integer Private strNombre As String Private strDescripcion As String

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Set(ByVal value As String) Me.strNombre = value End Set End Property Public Property Descripcion() As String Get Return Me.strDescripcion End Get Set(ByVal value As String) Me.strDescripcion = value End Set End Property

35 End Class

En nuestra clase CategoriaDAL agregaremos una funcin con el nombre de ObtenerListaCategorias() que nos retornara una lista de tipo Categoria la cual har una consulta a nuestra base de datos Northwind a nuestra tabla Categories y regresara una lista de objetos de la clase Categora. Para ejecutar esta consulta crearemos una instancia de nuestra clase SqlConnection la cual le pasaremos como parmetro al inicializar la clase nuestra cadena de conexin, para tener un poco mas de informacin sobre cadenas de conexin ir aqu. Crearemos un objeto de la clase SqlCommand Class el cual ejecutara nuestra consulta de SQL y crearemos un objeto de la clase SqlDataReader Class que ser el lector de datos que usaremos para barrer el resultado de nuestra consulta la cual asignaremos cada campo a la propiedad de la clase correspondiente y retornaremos la lista de objetos de la clase Categoria como se muestra a continuacin:
01 Imports System.Data 02 Imports System.Data.SqlClient 03 04 Public Class CategoriaDAL 05 06 07 08 Public Function ObtenerListaCategorias() As List(Of Categoria) Dim conSQLConnexion As New SqlConnection("Data 09 Source=SERVIDOR1;Initial Catalog=Northwind;Persist Security Info=True;User ID=user;Password=pass123") Dim cmdSQLComando As New SqlCommand("select CategoryID, 10 CategoryName, Description from Categories order by CategoryID", conSQLConnexion) 11 12 13 cmdSQLComando.CommandTimeout = 2000 cmdSQLComando.CommandType = Data.CommandType.Text Dim ldSQLLectorDatos As SqlDataReader Public [Error] As String

14 15 16 17 18 19

Dim lsListaCategorias As New List(Of Categoria) Try conSQLConnexion.Open() ldSQLLectorDatos = cmdSQLComando.ExecuteReader() Do While ldSQLLectorDatos.Read()

Dim cCategoria As New Categoria cCategoria.IDCategoria = 20 Convert.ToInt32(ldSQLLectorDatos("CategoryID")) cCategoria.Nombre = Convert.ToString(ldSQLLectorDatos("CategoryName")) cCategoria.Descripcion = 22 Convert.ToString(ldSQLLectorDatos("Description")) 21 23 24 25 26 27 28 29 30 31 32 33 34 35 End Class lsListaCategorias.Add(cCategoria) Loop ldSQLLectorDatos.Close() Catch ex As SqlException Me.Error = ex.Message.ToString() Finally conSQLConnexion.Close() conSQLConnexion.Dispose() End Try Return lsListaCategorias End Function

Nota: Es necesario agregar las referencias a nuestros ensamblados System.Data y System.Data.SqlClient en nuestro proyecto de librera de clases (ClassLibrary1). Despus de esto agregaremos otro proyecto a la solucin de tipo WCF Service tecnologa la cual pertenece a nuestro NET Framework que nos proporciona un modelo de programacin unificado para la creacin de aplicaciones orientadas a servicios, a este proyecto le asignaremos el nombre de WCFServices1 en el cual agregaremos un nuevo servicio WCF con el nombre de CategoriaServicio.svc. Al crear nuestro proyecto de servicios WCF hay que definir un contrato, pero que es esto?, un contrato especifica que operaciones se admiten en el servicio, los contratos se crean mediante la definicin de una interfaz de servicio, es decir nuestro contrato se establece entre nuestro servicio y nuestra interfaz en la cual definiremos nuestras funciones las cuales debern de estar especificadas en ambas partes. Despus de esta explicacin es necesario agregar a nuestro proyecto WCFServices1 la referencia a nuestro proyecto ClassLibrary1, esto dando clic sobre nuestro proyecto WCFServices1 en la opcin de agregar referencia.

Agregaremos la misma funcin que en nuestra ClaseDAL con el nombre de ObtenerListaCategorias() en nuestra interfaz:
01 Imports System.ServiceModel 02 Imports ClassLibrary1 03 04 <ServiceContract()> 05 Public Interface ICategoriaServicio 06 07 08 09 10 End Interface <OperationContract()> Function ObtenerListaCategorias() As List(Of Categoria)

En nuestro servicio crearemos nuestra funcin que implemente de nuestra interfaz y crearemos dentro una instancia de nuestra clase CategoriaDAL y ejecutaremos nuestra funcin:
01 Imports ClassLibrary1 02 03 Public Class CategoriaServicio 04 Implements ICategoriaServicio 05 06 07 Function ObtenerListaCategorias() As List(Of Categoria) Implements ICategoriaServicio.ObtenerListaCategorias Dim cCategoriaDAL As New CategoriaDAL

08 09 10

Return cCategoriaDAL.ObtenerListaCategorias() End Function

11 End Class

Nota: Es necesario generar nuestro proyecto WCFService1 al llegar a este punto, dando clic derecho sobre el mismo en la opcin de Volver a generar. Agregaremos referencia en nuestro proyecto de Silverlight a nuestro servicio CategoriaServicio.svc dando clic derecho sobre el nombre de nuestro proyecto WCFServices1 en la opcin de Agregar referencia de servicio como se muestra en las siguiente imagen:

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

Hasta este momento los proyectos en nuestra solucin debern verse como en la siguiente imagen:

Agregaremos en nuestra pagina MainPage.xaml un DataGrid con el nombre de DgrCategorias y un Botn con el nombre de BtnCargarDatos e importaremos en nuestra clase MainPage dentro del archivo MainPage.xaml.vb la referencia a nuestro servicio y agregaremos tambien el evento BtnCargarDatos_Click del boton que agregamos previamente en nuestra pagina. Al momento de agregar la referencia a nuestro servicio se crea un archivo con el nombre de Reference.vb el cual contiene nuestras clases, funciones y eventos, dicho archivo no esta visible pero es posible verlo directamente desde la ruta donde tenemos nuestra solucin en el proyecto de Silverlight, esto se explicara en alguna entrada futura. Agregaremos el mtodo ObtenerListaCategorias() el cual mandaremos llamar desde el evento BtnCargarDatos_Click de nuestro botn y agregaremos tambin el evento ObtenerListaCategoriasCompleted() , este evento nos servir para obtener los datos retornados por nuestra funcin, en nuestro evento ObtenerListaCategorias() crearemos el cliente para ejecutar la funcin de nuestro servicio, como se muestra a continuacin:
1 Private Sub ObtenerListaCategorias() 2 Dim cscCategoriaServicioCliente As New CategoriaServicioClient AddHandler 3 cscCategoriaServicioCliente.ObtenerListaCategoriasCompleted, AddressOf ObtenerListaCategoriasCompleted 4 cscCategoriaServicioCliente.ObtenerListaCategoriasAsync()

5 cscCategoriaServicioCliente.CloseAsync() 6 End Sub

En nuestro metodo ObtenerListaCategoriasCompleted() obtendremos el resultado de nuestra funcin ejecutada en el metodo ObtenerListaCategorias() este ser el patrn de uso que se vera cada vez que se tiene acceso a servicios con Silverlight, dicho resultado lo asignaremos como ItemSource de nuestro DataGrid:
Private Sub ObtenerListaCategoriasCompleted(ByVal sender As Object, ByVal e As ObtenerListaCategoriasCompletedEventArgs) 2 If e.Error Is Nothing Then 1 3 4 5 6 7 8 Else ' Mensaje de error End If If e.Result IsNot Nothing Then Me.DgrCategorias.ItemsSource = e.Result End If

9 End Sub

Hasta este momento si ejecutamos nuestro proyecto veremos que nos estar marcando el siguiente error: {System.ServiceModel.CommunicationException: Se ha producido un error al intentar realizar una solicitud al URI http://localhost:9228/CategoriaServicio.svc&#8217;. Puede deberse a un intento de acceso a un servicio de configuracin entre dominios sin una poltica entre dominios adecuada en contexto o una poltica no apropiada para servicios SOAP. Es posible que necesite ponerse en contacto con el propietario del servicio para publicar un archivo de poltica entre dominios y para asegurarse de que permite enviar encabezados HTTP relacionados con SOAP. Para solucionar este problema agregaremos un nuevo archivo XML a nuestro proyecto WCFService1 con el nombre de ClientAccessPolicy.xml el cual le agregaremos el siguiente esquema ya que por cuestiones de seguridad en Silverlight 4 es necesario especificar una poltica de acceso del cliente:
01 <?xml version="1.0" encoding="utf-8"?> 02 <access-policy> 03 04 05 06 07 08 09 10 11 12 <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access>

13 </access-policy>

Despus de agregar el archivo ClientAccessPolicy.xml y ejecutar nuestro proyecto nuestro DataGrid deber de verse de la siguiente manera:

http://jvsoft.wordpress.com/2010/10/08/como-consumir-wcf-services-en-silverlight-4usando-ado-net-y-sql-server-2008/

You might also like