Comunidad de desarrolladores de Puebla.NET
Iniciar sesión Unete ahora
 
 
Novedades | Anuncios | Eventos | Publicaciones | Foros | Bolsa de trabajo | Conocenos | Encuestas
 
  Buscar  
 
Anónimo
2631206 visitas desde Octubre de 2004
5 usuarios en línea
Contáctanos en línea:





Certificate Veracruz

Revista MTJ .NET


 
Servicios Web con WCF

Publicado por el Wednesday, June 11, 2008 (UMST)

Una sencilla introducción a los Servicios Web con WCF, con simples ejemplos...

Una sencilla introducción a los Servicios Web con WCF

Willy Mejía

 

El Microsoft .NET Framework 3.0 (aka NetFx3, antes WinFX) introdujo a WCF (Windows Communication Foundation) como una ventanilla única para la creación sobre .NET de todo tipo de servicios distribuidos, que incluye pero no se limita a los Servicios Web.

 

El siguiente cuadro muestra algunas clases importantes para WCF.

Elemento Clase o Interface
Address System.Uri
Binding System.ServiceModel.Binding
Contract System.ServiceModel Attributes
Endpoint System.ServiceModel.ServiceEndpoint

El presente artículo muestra cómo utilizar las clases y herramientas de WCF para crear y publicar un sencillo Servicio Web así como su cliente. Para lo cual se requiere tener instalado NetFx3 -o bien .NET Framework 3.5- con su correspondiente SDK.

 

Nota: Para una breve introducción a los Servicios Web puede leer: Guía Breve de Servicios Web.


Creando un Servicio Web muy simple

Para ilustrar la creación de Servicio con WCF emplearemos el clásico ejemplo de Hola Mundo, el cual luce así:

 

Listado de Hello.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;

namespace HelloService
{
  [ServiceContract()]
  public class Hello
  {
    private StringBuilder message = new StringBuilder("Hola ");

    [OperationContract]
    public string SayHello(string name)
    {
      String msg = message.Append(name + ".").ToString();
      System.Console.WriteLine(msg);
      return msg;
    }
  }
}

Nótese que luce como una clase normal pero con algunas adiciones: En primer lugar declaramos la utilización el ensamblado System.ServiceModel.dll, dentro del cual se encuentran los atributos con los cuales marcamos la clase Hello como un servicio (atributo ServiceContract) y al método como una operación (atributo OperationContract). Con esto habilitamos la clase para que pueda ser publicada como un Servicio WCF (el cual posteriormente desplegaremos como un Servicio Web) con una sola operación: la del método SayHello.

>csc /t:library Hello.cs /r:System.ServiceModel.dll

Con todo lo anterior ya tenemos un sencillo Servicio WCF casi listo para ser alojado y desplegado como un Servicio Web dentro de un Sitio Web ASP.NET, no obstante podemos probarlo sin necesidad de recurrir a IIS (o Cassini) si creamos un Endpoint dentro de una aplicación de consola que actuará como host del servicio, tal como se ilustra en el siguiente código:

 

Listado de HelloHost.cs

using System;
using System.ServiceModel;

namespace HelloHost
{
  class Program
  {
    static void Main(string[] args)
    {
      string endpointAddress = "http://localhost:8080/Hello";
      ServiceHost myServiceHost = 
        new ServiceHost(typeof(HelloService.Hello), new Uri(endpointAddress));
      myServiceHost.Open();
      System.Console.WriteLine("El Servicio Web Hello se está ejecutando...");
      System.Console.WriteLine("WSDL: " + endpointAddress + "?wsdl");
      System.Console.WriteLine("Presione una tecla para cerrarlo.");
      System.Console.ReadKey();
      if (myServiceHost.State != CommunicationState.Closed)
        myServiceHost.Close();
    }
  }
}

Nótese que se trata de una simple aplicación de consola que utiliza una instancia de la clase ServiceHost y sus métodos Open y Close para crear un Host para una instancia de la clase HelloService.Hello en la dirección (Address) http://localhost:8080/Hello. Esto último gracias a que la clase ServiceHost utiliza la información proporcionada tanto en el código como en el archivo de configuración -que veremos a continuación- para crear un ServiceDescription, el cual WCF utiliza para publicar un ServiceEndPoint.

 

Por lo que el siguiente paso es crear el archivo de configuración que se vinculará al ejecutable HelloHost.exe, con el siguiente contenido:

 

Listado de HelloHost.exe.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="HelloService.Hello" behaviorConfiguration="enableMetadata">
        <endpoint contract="HelloService.Hello" binding="basicHttpBinding" />
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="enableMetadata" >
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Lo importante a destacar es la línea:

<endpoint contract="HelloService.Hello" binding="basicHttpBinding" />

En la cual se especifica tanto la clase/interfaz que define al servicio (Contract), así como la forma de enlace (Binding) con el "Extremo" (Endpoint), cuya ubicación en la red (Address) se definió en el código del host. Estos tres elementos: Address, Binding & Contract, constituyen el ABC de los Endpoints de WCF. Para mayor información leer: Extremos: direcciones, enlaces y contratos.

 

Nota: El resto de la configuración (de color oliva) solo sirve para habilitar la exposición de los Metadatos del servicio, de modo que se pueda tener acceso al WSDL autogenerado. Pero no es necesaria para poder consumir el servicio, por lo que si se facilita el WSDL por otra vía no sería necesaria dicha configuración extra.

 

Tras compilar y ejecutar la aplicación se mostrarán dos líneas indicando que el servicio se está ejecutando así como la ubicación del documento WSDL del mismo, para cualquier cliente que desee consumir el mismo.

>csc /t:exe HelloHost.cs /r:System.ServiceModel.dll,Hello.dll
>HelloHost.exe

El Servicio Web Hello se esta ejecutando...
WSDL: http://localhost:8080/Hello?wsdl
Presione una tecla para cerrarlo.

Nota: Por motivos de seguridad se requiere de una cuenta con privilegios de Administrador para ejecutar el host.

Lo siguiente a realizar es crear un cliente que lo consuma.


Creando un Cliente muy simple para un Servicio Web muy simple

Ahora crearemos —en un directorio/proyecto distinto— el cliente para nuestro Servicio Web el cual debe estar publicado y en ejecución.
 
Pero primero necesitamos generar los artefactos cliente. Para ello utilizaremos la herramienta svcutil (Herramienta de utilidad de metadatos de ServiceModel) incluida en el Windows SDK for .NET Framework 3.x, a la cual le pasamos como argumento la ubicación del documento WSDL:
>svcutil http://localhost:8080/Hello?wsdl

Esto generará un archivo con la clases proxy, las cuales encapsularán la invocación de las operaciones del Servicios Web. En nuestro caso se generará el archivo Hello.cs (con la clase HelloClient que utilizaremos directamente en la aplicación cliente) así como el archivo output.config, el cual renombraremos como Client.exe.config, de modo que coincida con el nombre del ejecutable de la aplicación cliente.

 

Una vez generados los artefactos cliente solo resta crear el cliente en sí, nuevamente una simple aplicación de consola:

 

Listado de Client.cs

using System;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length > 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      HelloClient service = new HelloClient(); 
      result = service.SayHello(arg);
    }
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}

Nótese que para invocar la operación de nuestro Servicio Web primero creamos una instancia de la clase HelloClient (generada por svcutil) por medio de la cual después invocamos al método SayHello —tras del cual se invoca la operación del Servicio Web, el cual a su vez invoca el método correspondiente de la clase Hello implementada al inicio del artículo...

 

Solo resta compilar tanto el proxy como la aplicación cliente:

>csc /t:library Hello.cs

>csc /t:exe Client.cs /r:Hello.dll

Después ejecute la aplicación cliente con algún argumento, su nombre por ejemplo, si no se especifica argumento alguno la salida será "Hola Anónimo":

>Client Willy

Hola Willy.

La misma salida se desplegará en la consola del servicio.


Nota final

Con lo que hemos realizado vemos lo fácil que es crear y publicar un Servicio Web así como su cliente con WCF.

 

No obstante todo esto tan sólo fue el inicio, la finalidad fue dar una introducción al desarrollo de Servicios Web utilizando WCF esperando le motive a continuar para después "emplearse en la Fábrica". Quedan entonces muchas cosas por tratar, como crear un servicio y cliente a partir de un WSDL, el despliegue en IIS, utilizar contratos tanto de servicios, como de mensajes y de datos, Interoperabilidad y WS-*, etc...

 

Espero que sirva de algo y hasta la próxima.


Willy Mejía

willy.mx.kz


 

Agregar comentario