Inicio > asp.net > Web service o wcf (parte ii)

Web service o wcf (parte ii)

miércoles, 15 de junio de 2011 Dejar un comentario Ir a comentarios

windows communication foundation soaEn la anterior entrada web service o wcf escribimos sobre cómo programar un web service WS-* que realice la función de acceso a datos en una aplicación web. Con la publicación de la versión .Net 3.0 Microsoft unificó el abanico de tecnologías para desarrollo empresarial y distribuido Com+/DcomWeb Service, .Net Remoting, Message Queuing, en lo que en su proceso de desarrollo llamaba indigo y conocemos como Windows communication Foundation (wcf). En esta entrada veremos cómo escribir la misma funcionalidad con un wcf service y por qué puede interesarnos más que con un web service. Para ello utilizamos la versión 2010 express de Visual Studio. Abrimos el entorno de desarrollo, creamos un nuevo proyecto Wcf application service. Veremos que tendremos un Interface y una clase que hereda donde se implemetan los métodos, en nuestro caso para el acceso a datos,

 namespace WcfGetData
{
 [ServiceContract]
 public interface IService1
 {

 [OperationContract]

  // TODO: Add your service operations here

  DataSet GetAdminData();
 }
}
...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace WcfGetData
{
 // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
 public class Service1 : IService1
 {
 private DataSet AdminDatos;
 public DataSet GetAdminData()
 {
 string sqlcmd;
 SqlConnection ConEmp;
 SqlDataAdapter DataAdaptEmpresas;
 sqlcmd = "SELECT ident, nombreemp, direccion, telefono, personacont FROM empresas";
 ConEmp = new SqlConnection();
 ConEmp.ConnectionString = @"Data Source=.\SQLEXPRESS;database=datadb;User ID=user;Password=pass";
 DataAdaptEmpresas = new SqlDataAdapter(sqlcmd, ConEmp);
 AdminDatos = new DataSet();
 DataAdaptEmpresas.Fill(AdminDatos, "empresas");
 return (DataSet) AdminDatos;
 }

 }
}

Con esta lineas tenemos nuestro Wcf service, también se han sombreado el código donde están los atributos que describen la clase como Wcf service. Ahora pasamos al proyecto en el que creamos la aplicación que hospeda el Wcf Service, en este caso creamos una nueva web site en la misma solución a la que llamamos HostDevServer, agregamos una referencia al proyecto WcfGetData y editamos los ficheros .svc y web.config.  En el fichero .svc con la cabecera del servicio que debe hospedar y entradas en el fichero web.config sobre dónde esta configurado el Wcf  Service. Este proyecto HostDevServer, debe de estar ejecutándose siempre antes que hagamos uso del Wcf Service por lo que lo configuramos como proyecto de inicio.

<%@ServiceHost Service="WcfGetData.Service1"%>

...

<services>
 <service name="WcfGetData.Service1"
 behaviorConfiguration="MyServiceTypeBehaviors">
 <endpoint address="" binding="basicHttpBinding"
 contract="WcfGetData.IService1"/>
 <endpoint contract="IMetadataExchange"
 binding="mexHttpBinding" address="mex"/>
 </service>
 </services>

Queda por programar el proyecto cliente que hace uso del servicio. Creamos un nuevo proyecto, tipo web site, al que llamamos GetDataClient, añadimos un nuevo fichero .aspx y en él un GridView al que enlazamos el resultado de la consulta. Debemos de crear la referencia al Wcf Service, o podríamos usar la herramienta scvutil.exe para crear el proxy.  Con ello tenemos un fichero .cs con los métodos disponibles en el servicio y entradas en el web.config sobre su localización.

public partial class GetAdminDataResponse
{

 [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tempuri.org/", Order=0)]
 [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
 public System.Data.DataSet GetAdminDataResult;

 public GetAdminDataResponse()
 {
 }

 public GetAdminDataResponse(System.Data.DataSet GetAdminDataResult)
 {
 this.GetAdminDataResult = GetAdminDataResult;
 }
}

...

<system.serviceModel>
 <bindings>
 <basicHttpBinding>
 <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
 <security mode="None">
 <transport clientCredentialType="None" proxyCredentialType="None" realm="">
 <extendedProtectionPolicy policyEnforcement="Never"/>
 </transport>
 <message clientCredentialType="UserName" algorithmSuite="Default"/>
 </security>
 </binding>
 </basicHttpBinding>
 </bindings>
 <client>
 <endpoint address="http://localhost:8080/HostDevServer/GetDataWcfService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="IService1" name="BasicHttpBinding_IService1"/>
 </client>
 </system.serviceModel>

&nbsp;

GetDataSolutionNuestra solución debe quedar con los 3 proyectos tal como vemos en la figura de la izquierda, Ctrl+F5 y el GridView con los resultados de la consulta aparece.

Tal como empezamos la entrada, hablando de Wcf como englobar varias anteriores tecnologías de Microsoft, esta es una de las ventajas a usar WS-*, ya que Wcf soporta más estándares que web service, también aunque podemos usar Wse, con Wcf service podemos usar diferentes bindings, (http, tcp, ws-http), puede ser hospedado en IIS, Was, en otro Wcf service, y soporta transaciones Com+.

Categories: asp.net Tags: , ,
  1. Sin comentarios aún.
  1. Sin trackbacks aún.
Debes estar registrado para dejar un comentario.