Crear un servicio WCF en 10 pasos


Para los que no conozcáis Windows Comunication Foundation (WCF para los amigos) os dejo unos cuantos enlaces muy recomendables:Visión Global de Arquitectura de Windows Communication Foundation

Artículos de Aaron Skonard en MSDN Magazine (aunque los veáis en inglés, redirecciona a los artículos en castellano)Artículos de Juval Lowy en MSDN Magazine (lo mismo que los de Skonnard)Fundamentals of WCF Security – Michele Leroux Bustamante (en inglés, pero merece el esfuerzo)Blog de Oskar Álvarez en Geeks.msEn este post me voy a centrar en la implementación de un servicio WCF muy básico y con pasos muy concretos (algunos mucho más fáciles que otros).

Empecemos, en Visual Studio creamos una solución en blanco (a mi me gusta trabajar así, cada cual con sus manías), a la que añadimos dos proyectos de consola (con C#): Host y Cliente.

Y ahora vamos por partes:

Proyecto Host

1. Agregar referencia al ensamblado System.ServiceModel.
2. Definir una interface con el atributo [ServiceContract] para indicar que es la que define el contrato de WCF. Los métodos de esta interface que se vayan a exponer en deben incluir el atributo [OperationContract].

  
  [ServiceContract]
  public interface IClase
  {
      [OperationContract]
      string Funcion1();

      [OperationContract]
      int Funcion2();

      // Este método no se expone porque no tiene el atributo
      //[OperationContract]
      void MetodonoImplementado();
  }


3. Definir una clase que implemente la interface IClase (en un futuro post explicaré cómo se implementa una interface con sólo dos clics).


    class Clase : IClase
    {
       string IClase.Funcion1() { return "Respuesta"; }
      
       int IClase.Funcion2(){ return 10; }

       void IClase.MetodonoImplementado(){ return; }
    }



4. Añadimos un fichero de configuración (app.config) al proyecto, para establecer las propiedades del servicio.


  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
  <system.serviceModel>
    <services>
    <!--Comportamiento se define un poco más abajo, en la sección BEHAVIORS-->
      <service name="Host.Clase" behaviorConfiguration="Comportamiento">
        <host>
   <!--Se establece la URL del servicio-->
           <baseAddresses>
             <add baseAddress="http://localhost:8000/WCF/"/>
          </baseAddresses>
        </host>
       <!--En el enpoint se define el ABC de los servicios WCF, Address, Binding y Contract-->
        <endpoint address="Clase"
                  binding="wsDualHttpBinding"
                  contract="Host.IClase"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Comportamiento">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
 </configuration>



5. En el método Main() iniciamos el servicio.



  class Program
  {
    static void Main(string[] args)
    {
       Type tipo = typeof(Clase);
       using (ServiceHost miHost = new ServiceHost(tipo))
       {
          miHost.Open();
          Console.WriteLine("Servicio en ejecución");
          Console.WriteLine("Pulse una tecla para salir...");
          Console.ReadKey();

          miHost.Close();
       }
  }



6. Ejecutamos únicamente el proyecto Host.

7. Desde la consola de Visual Studio * ejecutamos la herramienta svcutil.exe, que creará los ficheros que servirán de proxy entre el cliente y el servicio.


Se crean 2 ficheros:
- Clase.cs - definición del proxy.
- Output.config - fichero de configuración, que debe ser renombrado como
app.config para los proyectos Windows (web.config para proyectos Web)

* Consola de Visual Studio, la podemos encontrar en: Inicio - Todos los programas - Microsoft Visual Studio 2005 - Herramientas de Visual Studio


Paramos la ejecución y pasamos al otro proyecto.
Proyecto Cliente
8. Agregamos la referencia al ensamblado System.ServiceModel, igual que el paso 1 del proyecto Host.

9. Añadimos los ficheros que genera la herramienta svcutil.exe (paso 7 del proyecto Host), Clase.cs y app.config.

10. En el método Main() iniciamos el proxy y ejecutamos los métodos.


class Program
{
   static void Main(string[] args)
   {
     Console.WriteLine("Pulse cualquier tecla cuando el servicio esté iniciado...");
     Console.ReadKey();

     using (ClaseClient proxy = new ClaseClient(“WSDualHttpBinding_IClase”))
     {
        Console.WriteLine(proxy.Funcion1());
        Console.WriteLine(proxy.Funcion2().ToString());
        Console.WriteLine("Pulse cualquier tecla para salir...");
        Console.ReadKey();
        proxy.Close();
     }
   }
}


Ya lo tenemos todo listo, vamos a probarlo, para ello tenemos que ejecutar los dos proyectos al mismo tiempo, por lo que en las propiedades de la solución hay que establecer Proyectos de inicio múltiples y establecer la acción de ambos proyectos a Iniciar, y ejecutar (F5).

Por supuesto que WCF es mucho más complejo, pero como toma de contacto creo que está bien, en próximos post entraremos en profundidad en más características.


Así de rupestre como se ve, Saludos

Inspirado por Programando en .Net

1 comentario:

  1. oye amigo tendras el codigo de muestra ya que estoy usando visual express 2012 y no me salen esas opciones gracias

    ResponderEliminar