Windows Communication Foundation con GeneXus

Unofficial Content

 

 

Versión en Ingles

A partir de la XEv1 U2 se implementó el soporte WCF para objetos que se exponen como web service y para external objects que importan servicios.
Compatibilidad : Esto sustituye al soporte de WSE 3.0 que existía anteriormente, y quienes usaran esta implementacion deben migrar a WCF.

Introducción

Windows Communication Foundation (WCF) es una arquitectura que permite proveer y consumir servicios de forma simple y potente en .NET. La arquitectura se basa en el concepto de "endpoint" (punto de acceso), un servicio WCF es un programa que expone un conjunto de endpoints, y un cliente WCF es un programa que intercambia mensajes con uno o mas endpoints.

Un Endpoint se compone de tres cosas:

  • Address - indica donde se encuentra el servicio
  • Binding - indica como se comunica el servicio, esto es, que protocolo de transporte utiliza (HTTP, TCP, etc) y como es la seguridad (SSL, WS-Security, etc). El .NET  Framework posee un conjunto de bindings predefinidos que representan los casos mas comunes lo que simplifica la configuración.
  • Contract - indica que es lo que se comunica, esto es, la estructura de los mensajes y los patrones de comunicacion (one-way, duplex, etc.)

Para utilizar esta funcionalidad en Genexus con el generador .Net existe la propiedad "Use Native Soap" a nivel de objeto y generador que permite seleccionar cuando generar o no, utilizando el soporte nativo.
Para utilzar esta propiedad es necesario compilar con .Net framework 3.5 o superior (propiedad "Compiler path")

Esta aplica a objetos que consumen o exponen web services:

  • Procs con call protocol SOAP
  • Data Providers
  • Business Components
  • External Objecs

El valor por defecto es NO, por compatibilidad con versiones anteriores del generador .Net

Cuando se activa esta propiedad los objetos que consumen y exponen web services se generan con la infraestructura que permite utilizar la serialización y comunicación WCF. Además se genera la configuración necesaria para proveer o acceder a servicios WCF, para los servicios provistos, se genera también un archivo con extensión .svc que funciona como punto de entrada al servicio WCF (los servicios expuestos con WCF tienen extensión "svc").

Con este generador, TODOS los SDTs generan el codigo necesario para serializacion nativa y WCF (independientemente de si se utilizan para serializar nativo o con la serializacion generada por GX), lo que requiere la version del .Net Framework 3.5 o superior.

Configuración

Un concepto importante de WCF es la posibilidad de alterar los parámetros de interconexión de servicios modificando archivos de configuración, esta idea permite que los parámetros que hacen a la interoperabilidad se configuren en tiempo de deploy en lugar de hacerlo cuando se programa la aplicación. GX genera la configuración básica para que los servicios puedan ser utilizados, esta configuración puede ser luego modificada por el developer al momento de hacer el deploy (por ejemplo para agregar seguridad). Esto se hace en el web.config, es un esquema bastante potente, se pueden encontrar mas detalle aca: msdn.microsoft.com/en-us/library/ms730120.aspx

Configuración del proveedor de servicios
Para los objetos que se exponen como web service y se generan con soporte WCF se genera la configuración correspondiente en el web.config, de la siguiente forma:
Address - dirección del sitio web donde esta ejecutando el servicio.
Binding - se utiliza "basicHttpBinding", esto implica:  transporte HTTP, mensajes de texto con encoding UTF-8, sin seguridad a nivel se mensajes (aunque se puede configurar dentro del binding)
Contract - Un mensaje de entrada y uno de salida construido en función de los parámetros del servicio, wrapped en todos los casos.

Ejemplo de esta configuracion en el web.config:
    <services>
        <service name="GeneXus.Programs.asoapproc_services" behaviorConfiguration="ServiceDefaultBehavior">
            <endpoint address="" binding="basicHttpBinding" contract="GeneXus.Programs.asoapproc_services" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <serviceBehaviors>
        <behavior name="ServiceDefaultBehavior">
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
    </serviceBehaviors>

Esta configuración también incluye la posibilidad de acceder al servicio para consultar metadata, ya sea en formato MEX (Metadata Exchange Format) o WSDL.

Configuración del cliente de servicios

Para los external objects que acceden a servicios web importados, también se configuran los enpoints de la misma forma, por ejemplo, para comunicarse con un servicio .NET (ASMX):

    <client>
        <endpoint name="GeneXus.Programs.SdtService1Client" 
              address="http://localhost/testservice/service1.asmx" 
              binding="basicHttpBinding" 
              contract="GeneXus.Programs.ISdtService1" />
    </client> 

Esta sección es autogenerada en el archivo WCFClient.config. En aplicaciones Web es necesario reescribir las lineas en la seccion "system.serviceModel" del archivo web.config

Por mas información acerca de WCF : http://msdn.microsoft.com/en-us/library/aa480190.aspx o http://msdn.microsoft.com/en-us/library/ms731354(v=VS.100).aspx
Por mas información acerca de como migrar de WSE a WCF : http://msdn.microsoft.com/es-es/library/ms732008.aspx