Creando un sencillo Servicio Web WCF


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.Text;
using System.ServiceModel;

namespace hello
{
  [ServiceContract(Namespace="http://hello/")]
  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")]
  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 del namespace System.ServiceModel dentro del cual se encuentran las clases atributo con las cuales marcamos la clase Hello como el contrato del servicio (atributo ServiceContract) y al método SayHellocomo una operación del mismo (atributo OperationContract). Con esto habilitamos la clase para que pueda ser consumida como un Servicio WCF el cual posteriormente publicaremos como un Servicio Web. Finalmente el atributo ServiceBehavior especifica el comportamiento de ejecución de una implementación del contrato de servicio, es éste caso sólo lo empleamos para especificar lo que será el “targetNamespace” y “name” del servicio para la exportación de la definición del mismo a través de WSDL.

Solo resta compilar la clase, asegurándonos de referenciar al ensamblado System.ServiceModel.dll:

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

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

Nota: Para revisar otras opciones de “alojamiento” de servicios WCF consultar: Alojando Servicios.

Listado de HelloHost.cs

using System;
using System.ServiceModel;

class HelloHost
{
  static void Main(string[] args)
  {
    string endpointAddress = "http://localhost:8080/hello";
    ServiceHost myServiceHost = 
      new ServiceHost(typeof(hello.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 para crear un endpoint para un servicio de tipo 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 y publicar un ServiceEndpoint.

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

Listado de HelloHost.exe.config

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

Observe que en éste caso la clase hello.Hello sirve tanto para definir la clase de implementación del servicio como su contrato, es por ello que aparece tanto en el atributo name del elemento service, como en el atributo contract del elemento endpoint. En un artículo posterior veremos que esto se puede realizar de forma separada utilizando una interfaz como contrato.

Lo siguiente a destacar es la línea:

<endpoint contract="hello.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 endpoint, cuya ubicación en la red (Address) se definió en el código de HelloHost. Estos tres elementos: Address, Binding & Contract, constituyen el ABC de los Endpoints de WCF. Para más información al respecto consultar: Endpoints: Address, Bindings and Contracts.

El enlace de tipo basicHttpBinding representa la forma de enlace que el servicio WCF utiliza para configurar y exponer su correspondiente endpoint de modo que el servicio pueda comunicarse como un Servicio Web (basado en ASMX) que cumple con el WS-I Basic Profile 1.1.

Los atributos del endpoint bindingNamespace y name sirven para especificar el “targetNamespace” y “name” del enlace para la definición a través de WSDL.

Nota: El resto de la configuración (de color oliva) sirve para habilitar la exposición de los Metadatos del servicio, de modo que se pueda tener acceso al WSDL generado bajo demanda. No es necesaria para poder consumir el servicio, por lo que si se facilita el WSDL por otra vía bien podría omitirse dicha configuración extra.

Una vez elaborado el archivo de configuración solo resta compilar y ejecutar HelloHost, el cual mostrará unas líneas indicando que el servicio se está ejecutando, así como la ubicación del documento WSDL del mismo para cualquier cliente que desee consumirlo.

>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: Se requiere de una cuenta con privilegios de Administrador para ejecutar el host, o bien para modificar los derechos de la reserva para una parte del espacio de nombres HTTP. Para más información consulte: Configuración de los elementos de enlace de transporte HTTP y HTTPS para WCF.

Lo siguiente a realizar, es crear un cliente que lo consuma…

Acerca de Willy Mejia

Developer, Techie, Human... http://about.me/willyxoft
Esta entrada fue publicada en .NET, NetFx3, Servicios, servicios web, WCF. Guarda el enlace permanente.

Una respuesta a Creando un sencillo Servicio Web WCF

  1. Pingback: Creando clientes para el Servicio WCF « WillyXoft

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s