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:

Download de VSTO SE, version RTM para Office 2007

Acabo de leer por el oceano de Internet que ya esta disponible la version RTM de VSTO para Office 2007, no se si llego tarde pero aqui esta.

El enlace para descargar (VSTO para Office-2007), es decir, Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System, es:

http://www.microsoft.com/downloads/details.aspx?familyid=5E86CAB3-6FD6-4955-B979-E1676DB6B3CB&displaylang=en

 

Technorati tags:

WCF El contrato

Despues de intertar explicar que es el ABC en WCF, vamos a meternos en harina.


Lo primero que debemos hacer es establecer el contrato, esto es, que metodos va a exponer nuestro servicio. Miguel Jimenez me dio una comparación muy buena. “Imaginate que tu servicio es una tintoreria, el contrato en ese caso seria Limpiar un traje, Planchar… todo lo que nos ofrece la tintoreria es un contrato”.


Para establecer el contrato en WCF debemos escribir una Interface que es la manera de representar los contratos.


Si recordamos una interfaz en .NET se escribia


public interface IDerivativesCalculator



{

     decimal CalculateDerivative(

                                 string[] symbols,

                                 decimal[] parameters,

                                 string[] functions);

     void DoNothing();

}


En la que indicamos que operaciones debe tener una clase que implemente esta Interfaz. Para convertir esta interfaz en un contrato de WCF solo tenemos que incluir la libreria System.ServiceModel y utilizar atributos.


El primer atributo a utilizar es [ServiceContract], este atributo indica que el interfaz es un contrato de WCF. Ahora debemos de indicar que operaciones soporta este contrato, para ello utilizamos el atributo [OperationContract] en cada uno de los metodos que queremos que el servicio exponga.


El codigo anterior lo transformariamos en


 


[ServiceContract]


public interface IDerivativesCalculator



{

   [OperationContract

    decimal CalculateDerivative(

                                 string[] symbols,

                                 decimal[] parameters,

                                 string[] functions);

     void DoNothing();

}


Como podemos ver hemos definido el contrato IDerivativesCalculator que expone el metodo CalculateDerivative y debemos señalar que el metodo DoNothing no se expondria porque no tiene el atributo [OperationContract].

 


Technorati tags:

Comienzo con WCF

Debido al proyecto que estoy desarrollando me toca sumergirme en WCF y creo que es una buena oportunidad para exponer los escasos conocimientos que vaya adquiriendo y exponerlos en el blog.


Empezemos pues (esta palabra me sale hasta escribiendo).


Seguro que esto lo habeis leido en un monton de sitios, pero considero que es fundamental para el que comienza con WCF.


WCF antes denominado Indigo (un nombre mas elegante) es el framework unificado para el desarrollo de sistemas distribuidos, de manera, que todas las tecnologias que teniamos en nuestras manos (Servicios Web, DCOM+, Remoting…) las tenemos ahora en una unica tecnología. Pero ademas nos proporciona una serie de servicios que nos van a permitir aislarnos de cuestiones de comunicacion y protocolos.


El ABC en WCF es una regla nemotecnica que nos permite recordar de manera facil tres conceptos importantismos en WCF



  • Adress: Nos va a indicar donde esta el servicio, esto se traduce en una URI del tipo de los servicios Web http:\localhostMiServicio.asmx pero ahora estas Uris pueden direccionar los siguientes protocolos.


    1. HTTP
    2. TCP
    3. NamedPipe
    4. Peer2Peer
    5. MSMQ

  • Binding: Un binding nos especifica como se accede al servicio, esto es: protocolo que se utiliza, codificación (texto, binario…) y protocolos WS-* que permiten mensajes transacionales.

  • Contract: El contrato nos indica que ofrece el servicio, es decir, que metodos y operaciones expone .

Para un servicio pueden existir diferentes combinaciones de ABC, por ejemplo un servicio puede exponer n operaciones (metodos) y pueden haber muchas combinaciones ABC para un cierto servicio (p.ej. que expone operaciones, con un protocolo distinto y mediante un URL distinto). Cada combinación se denomina un endpoint, o sea que un servicio de WCF puede tener múltiples endpoints


Un Dibujo vale mas que mil palabras


 


wcfabc.png


Presentación de un Blogger

 


Hola, mi nombre es Oskar Alvarez y soy de Bilbo. Me he metido en este embrollo de escribir entre tanta gente de nivel por la insistencia de Miguel Jimenez que ademas de esto me ha convencido de crear un nuevo grupo de usuarios que aprovechando que le Ebro pasa por Zaragoza os presento en este post.

Este grupo de usuarios que acaba de nacer lo hemos llamado Artalde (que por estos lares significa rebaño de ovejas, algo querra decir), suerte que contamos con gente de nivel (y no es porque seamos de Bilbao, algo si tiene que ver). Decir a la gente que sea de Bilbao y alrrededores (es decir todo el mundo) que se anime a apuntarse a este grupo de usuarios en el que intentaremos aprender y sobre todo pasarlo bien. Espero presentaros en breve nuestro primer evento.

Pues (ya me salio la vena) al tajo


Technorati tags:

Enterprise Library 2.0

En esta epoca en la que Microsoft ha revolucionado todo el desarrollo en .NET con su FrameWork 3.0, nos olvidamos de aquellos elementos que facilitan nuestro trabajo. Para mi una de ellos es el Enterprise Library. El porque es muy sencillo, implementan las mejores prácticas del equipo de Patterns and Practices de Microsoft, con lo que por herencia algo bien ya estaremos haciendo nosostros si las utilizamos.

  • Enterprise Librery 2.0 no es parte del FrameWork, es una biblioteca independiente que hay que copiar o instalar.
  • No es un Framework de aplicación que no impone un estilo de arquitectura, es decir, no obliga por ejemplo a utilizar procedimientos almacenados siempre, sino que puedes diseñar tu arquitectura con sentencias SQL. Solo facilita el proceso
  • No es un producto de Microsoft, es decir que no hay soporte, localización …
  • No se vende

Realmente es una librería de bloques de aplicación que resuelve problemas comunes compuesto de un conjunto de clases que ayudan a trabajar con cualquier estilo de arquitectura. Un aspecto importante es que viene con código fuente lo que permite extenderlo y es gratuito.

En esta imagen se pude ver de manera resumida lo que nos ofrece Enterprise Library

 

 

Los objetivos que se han marcado los desarrolladores de Enterprise son:

  • Consistencia: Patrones de diseño e implementación congruente en todos los bloques de aplicación
  • Extensibilidad: Todos los bloques incluyen puntos de extensibilidad que permiten a los desarrolladores personalizar el comportamiento de los bloques agregando código
  • Facilidad de Uso: Mejoras en la usabilidad que incluyen, herramienta grafica de configuración , procedimientos de instalación mas simples y documentación.
  • Integración: Diseñados para trabajar juntos y probados para garantizar que si lo hacen, sin perder la posibilidad de manejar los bloques independientemente.

Pero para mi lo mas importante que me ha dado Enterprise Library es la homegeneidad que ha proprocionado a todos los proyectos en los que desarrollamos. Cualquier persona puede incorporarse a un equipo de trabajo y el tiempo de adaptación al proyecto es minimo ya que conocen la tecnología, patrones….

Technorati tags: ,