Está en la página 1de 10

Nota:

CARRERA DE SISTEMAS E INFORMATICA TALLER DE CERTIFICACION DE VISUAL STUDIO 2010 Profesor del Curso I. OBJETIVO : Raul Solis Mendiola

Crear una aplicacin con Silverlight

Cmo 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:

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 Private intIDCategoria As Integer Private strNombre As String Private strDescripcion As String

Public Property IDCategoria() As Integer Get Return Me.intIDCategoria End Get

Set(ByVal value As Integer) Me.intIDCategoria = value End Set

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

End Property Public Property Nombre() As String Get Return Me.strNombre

End Get Set(ByVal value As String) Me.strNombre = value End Set

End Property

Public Property Descripcion() As String Get Return Me.strDescripcion End Get

End Set End Property

Set(ByVal value As String) Me.strDescripcion = value

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 05 06 07 08 09 04 Public Class CategoriaDAL Public [Error] As String Public Function ObtenerListaCategorias() As List(Of Categoria)

Dim conSQLConnexion As New SqlConnection("Data 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 14 15 16 17 18 19 cmdSQLComando.CommandTimeout = 2000 cmdSQLComando.CommandType = Data.CommandType.Text Dim ldSQLLectorDatos As SqlDataReader Dim lsListaCategorias As New List(Of Categoria) Try conSQLConnexion.Open()

Dim cCategoria As New Categoria cCategoria.IDCategoria = 20 Convert.ToInt32(ldSQLLectorDatos("CategoryID")) 21

ldSQLLectorDatos = cmdSQLComando.ExecuteReader() Do While ldSQLLectorDatos.Read()

cCategoria.Nombre = Convert.ToString(ldSQLLectorDatos("CategoryName")) cCategoria.Descripcion = 22 Convert.ToString(ldSQLLectorDatos("Description")) 23 24 25 26 27 28 29 30 31 32 33 34 Loop lsListaCategorias.Add(cCategoria)

ldSQLLectorDatos.Close() Catch ex As SqlException

Me.Error = ex.Message.ToString() Finally conSQLConnexion.Close() conSQLConnexion.Dispose()

End Function

End Try Return lsListaCategorias

35 End Class

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()> 06 07 08 09

05 Public Interface ICategoriaServicio <OperationContract()> Function ObtenerListaCategorias() As List(Of Categoria)

10 End Interface

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 08 09 10

Function ObtenerListaCategorias() As List(Of Categoria) Implements ICategoriaServicio.ObtenerListaCategorias Dim cCategoriaDAL As New CategoriaDAL 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 If e.Result IsNot Nothing Then Me.DgrCategorias.ItemsSource = e.Result End If

Else

9 End Sub

' Mensaje de error End If

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>

13 </access-policy>

</policy> </cross-domain-access>

<resource path="/" include-subpaths="true"/> </grant-to>

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

También podría gustarte