Tutorial WCF (4 de 5)

Artículos anteriores:
Tutorial WCF (1 de 5)
Tutorial WCF (2 de 5)
Tutorial WCF (3 de 5)

4- APLICACIÓN HOST


Otra forma de servir un servicio de WCF es hacer que una aplicación haga de host del servicio y sea ésta la que tenga el control sobre éste. En este tutorial haremos que sea una aplicación de consola pero podría, tranquilamente, ser cualquier otro tipo de aplicación como, por ejemplo, un servicio de Windows.


Partiremos del servicio creado en el segundo post de este tutorial, el que no tiene ningún archivo de configuración ni el .svc; ya que éstos son para servirlo mediante IIS. En este caso el archivo de configuración lo tendrá la aplicación que hará de host.


Empezamos creando un nuevo proyecto de consola que llamaremos Host y al que importaremos dos dlls .La primer será la necesaria para trabajar con WCF; System.ServiceModel, y la segunda será la que genera nuestro proyecto del servicio de WCF; BlogWCF.dll. En el archivo Program.cs añadiremos los using/import de ambas dlls y escribiremos el código necesario para que arranque el servicio:



using System;
using System.Collections.Generic;
using System.ServiceModel;
using BlogWCF;
 
namespace Tests
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost hos = new ServiceHost(typeof(MiServicio));
            Console.WriteLine(«Presiona cualquier tecla para empezar»);
            Console.ReadKey(true);
            try
            {
                hos.Open();
                Console.WriteLine(«El servicio se esta sirviendo correctamente… «);
                Console.WriteLine(«presiona cualquier tecla para cerrarlo.»);
                Console.ReadKey(true);
                hos.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(«ERROR: «, ex.Message);
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey(true);
        }
    }
}

Vemos que lo primero que hace es crear una instancia de la clase ServiceHost indicándole a ésta que tipo de servicio va a usar. Luego, entre un bloque try/catch por si surge algún problema, hacemos que empiece a servir-se el servicio (válgase la redundancia), y lo cerramos una vez usado.


Pero con esto no estamos aun, falta definir como va a ser el canal de comunicación y como se va a acceder al servicio. Para ello añadiremos un fichero de configuración a nuestra aplicación Host. Como en este caso sí que se trata de una aplicación normal y no de una aplicación web añadiremos un archivo App.config con la siguiente información:



<?xml version=»1.0″ encoding=»utf-8″ ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name=»BlogWCF.MiServicio»  behaviorConfiguration=»lala»>
        <host>
          <baseAddresses>
            <add baseAddress=»http://localhost:8000/BlogWCF»/>
          </baseAddresses>
        </host>
        <endpoint address=»Servicio»
                  binding=»basicHttpBinding»
                  contract=»BlogWCF.IMiServicio»/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name=»lala»>
          <serviceMetadata httpGetEnabled=»true»/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Como vemos es casi igual al que teníamos antes para el Web.config pero cambiando el puerto de destino y la forma de definir las direcciones. El puerto que usaba antes era el 80, el puerto por defecto para comunicaciones mediante http. Si no ponemos un puerto diferente (y libre) nos dará un error, ya que estaremos intentando servir por un puerto que lo esta usando otra aplicación, en nuestro caso el IIS. Las direcciones se generaran en este caso concatenando la baseAddress específica a un protocolo con la address del endpoint. En este caso solo tenemos una y uno, y no hay donde perderse, pero puede haber más de una baseAddress más de un endpoint. La forma de concatenarse dependerá del binding al protocolo utilizado: en este caso en basicHttpBinding busca la baseAddress que empiece por http.


Ahora ya tenemos todo preparado para hospedar nuestro servicio. Si todo esta bien y ejecutamos nuestra aplicación tiene que salir esta pantalla:


console1


Si mantenemos el servicio sin cerrarlo y abrimos una nueva ventana de comandos (Inicio->Ejecutar->’cmd’) y escribimos el comando netstat -a -n veremos que nos aparece que hay un servicio ejecutandose en el puerto 8000: el nuestro. Si quitamos la opción -n veremos que protocolo usa (http).

console2

Si queremos además servir nuestro servicio también con el protocolo tcp por el puerto 8080 solo debemos editar el App.config de la manera siguiente:



<?xml version=»1.0″ encoding=»utf-8″ ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name=»BlogWCF.MiServicio»  behaviorConfiguration=»lala»>
        <host>
          <baseAddresses>
            <add baseAddress=»http://localhost:8000/BlogWCF»/>
            <add baseAddress=»net.tcp://localhost:8080/BlogWCF»/>
          </baseAddresses>
        </host>
        <endpoint address=»Servicio»
                  binding=»basicHttpBinding»
                  contract=»BlogWCF.IMiServicio»/>
        <endpoint address=»Servicio»
                  binding=»netTcpBinding»
                  contract=»BlogWCF.IMiServicio»/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name=»lala»>
          <serviceMetadata httpGetEnabled=»true»/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

En este caso tenemos dos baseAddress y dos enpoints: se concatenarán las direcciones por el protocolo. Si os fijáis la baseAddress que se refiere al protocolo tcp empieza por net.tcp. Si ejecutamos y volvemos a mirar el netstat veremos que tenemos el servicio sirviéndose por dos puertos diferentes y con protocolos diferentes:


console3


Con esto ya hemos visto como podemos servir nuestros servicios y añadir enpoints con diferentes mecanismos de comunicación a cada uno.


Ahora falta ver como consumirlos, pero esto será en el siguiente post: Consumiendo un Servicio de WCF.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *