WCF Construyendo el primer Servicio

Una vez que hemos definido el contrato lo primero que se nos viene a la cabeza que tenemos que hacer es implementar ese contrato, esto es facil y sencillo, debemos de crear una clase que implemente la interfaz.

 

public class DerivativesCalculatorServiceType: IDerivativesCalculator
{
#region IDerivativesCalculator Members

decimal IDerivativesCalculator.CalculateDerivative(
                 string[] symbols,
                 decimal[] parameters,
                 string[] functions)
     {
                return new Calculator().CalculateDerivative(symbols, parameters, functions);
      }

void IDerivativesCalculator.DoNothing()
     {
                 return;
     }

#endregion
}

Despues de implementar el contrato tenemos que indicar como vamos a realizar el Hosting del servicio. En WCF se utiliza la clase ServiceHost. Esta clase es la que se encarga del alojamiento de nuestro servicio al igual que hacia IIS con nuestros Servicios Web.

Vamos a ver el codigo para explicarlo mas detenidamente. El codigo que viene a continuación es de un proyeco consola que va a exponer el servicio.

 

public static void Main(string[] args)
        {
            //Creamos un objeto Uri que apunta a la dirección que utilizaremos
            //para acceder a nuestro servicio. Luego creamos un objeto ServiceHost,
            //el servicio propiamente dicho que expondrá el contrato especificado en la dirección indicada.

            Type serviceType = typeof(DerivativesCalculatorServiceType);

            string httpBaseAddress =
                ConfigurationManager.AppSettings["HTTPBaseAddress"];
            Uri httpBaseAddressUri = new Uri(httpBaseAddress);
            Uri[] baseAdresses = new Uri[] { 
                httpBaseAddressUri};

            //Por último abrimos el servicio y esperamos a que el usuario pulse una tecla para cerrar el servicio
            using(ServiceHost host = new ServiceHost(
                serviceType,
                baseAdresses))
            {
                host.Open();

                Console.WriteLine(
                    "The derivatives calculator service is available."
                );
                Console.ReadKey();

                host.Close();
            }
        }
 

Con el codigo anterior hemos creado el servicio y le hemos indicado una adress donde se expondra el servicio, pero todavia nos falta el binding, se lo podiamos indicar tambien por codigo (lo veremos mas adelante), pero lo bueno de WCF es que se puede configurar a traves de ficheros de configuración. Para ello en el fichero App.config introducimos las siguientes entradas.

<system.serviceModel>
		<services>
    <service      name="DerivativesCalculator.DerivativesCalculatorServiceType">
      <endpoint address="http://localhost:8000/Derivatives/" binding="basicHttpBinding"
        bindingConfiguration="" contract="DerivativesCalculator.IDerivativesCalculator" />
    </service>
  </services>
</system.serviceModel>

Donde indicamos el ABC de nuestro servicio, de manera que si arrancamos nuestra aplicacion de consola nos encontramos con el resultado de que nuestro servicio ya esta expuesto.

 

Debo de indicar que si estamos desarrollando en Windows Vista, nos encontraremos con la bonita excepcion (primera torta)

“System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://+:8080/<…>.  Your process does not have access rights to this namespace (see here.  for details). —> System.Net.HttpListenerException: Access is denied”

Esta excepcion es debida al sistema de seguridad de Windows Vista que requiere entorno de administración para cuando se va a ejecutar algo que puede ser potencialmente peligroso. Esto solo pasa en Debug y las unicas maneras de poder realizar el debug es arrancar VS.2005 con la opción “Run as Administrator” del botón derecho. O lo mismo si arrancas directamente el .EXE del servicio sin hacer DEBUGGING.

 

Otra opción es deshabilitar la POLITICA que realiza este tipo de preguntas de seguridad (UAC model de Windows Vista ), yo no lo recomiendo pero es otra opción.

Ya estamos contentos hemos expuesto nuestro primer servicio, y me pregunto cual es la manera de comprobar que realmente esta expuesto o solo es una pantalla de consola. La manera de comprobarlo es realizar el cliente o la mas rapida abrir nuestro IE e indicarle la dirección de nuestro servicio.

La respuesta que tengo es:

This is a Windows© Communication Foundation service.
Metadata publishing for this service is currently disabled.

La segunda torta, y esta la veo menos claro que la anterior, pero buceando por la web (que gran invento) veo la explicación y una vez vista ya se sabe todo se entiende.

Sin la informacion de los metadatos deberiamos de programar el proxy de acceso al servicio web de forma manual, lo cual es un coñazo (perdon), pero desde el punto de vista de la seguridad es lo mas acertado, con lo que debemos optar a realizar nuestro cliente con los metadatos y una vez realizado desactivarlo.

Para habilitar los metadatos, solo debemos recurrir al fichero de configuración y agregar un nuevo item a nuestro fichero este item es

<system.serviceModel>
		<services>
    <service behaviorConfiguration="DerivativesCalculatorService"
      name="DerivativesCalculator.DerivativesCalculatorServiceType">
      <endpoint address="http://localhost:8000/Derivatives/" binding="basicHttpBinding"
        bindingConfiguration="" contract="DerivativesCalculator.IDerivativesCalculator" />
    </service>
  </services>
   
		<behaviors>
    <serviceBehaviors>
      <behavior name="DerivativesCalculatorService">
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
	</system.serviceModel>

con la entrada  behaviorConfiguration=“DerivativesCalculatorService”  le indicamos el comportamiento de nuestro servicio, que en este caso le indicamos que exponemos los metadatos, es decir, la capacidad de consultar el servicio por el documento wsdl.

Si ejecutamos nuestro servidor y navegamos a la dirección http://localhost:8000/Derivatives/, esta vez se nos mostrará un mensaje dándonos las instrucciones de como generar nuestro proxy y ejemplos básicos en C# y Visual Basic de como instanciar el servicio.

 

 

En el siguiente Post veremos como crear el cliente que consuma estos servicios

 

Technorati tags:

2 comentarios sobre “WCF Construyendo el primer Servicio”

  1. Tengo un problema, a ver si me puedes ayudar:

    Tengo una aplicación que consume un WS ubicado en otro lado. Trabajaba bien hasta que de repente, así sin más, dejo de funcionar, y luego lo hizo esporádicamente. La aplicación envía un xml para ser validado por el ws, pero seguido me regresa un error de Time-out, o de que me cerraron la conexión, y a veces trabaja como se espera. Ya he intentado varias modificaciones en mi aplicación pero comienzo a preguntarme si no está el error en el server del WS. Alguna idea?? Gracias de antemano

Deja un comentario

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