Comunidad Kryteria
Sitio de encuentro para profesionales de TI
WCF 4 Custom Bindings!

Continuando con la entrega de apuntes relacionados con WCF, como mencionamos en artículos anteriores WCF cuenta con un conjunto de bindings predefinidos, sin embargo puede presentarse el escenario que para el problema que se quiere resolver ninguno de ellos proporcione la solución; para esto nuestra alternativa es la creación de un nuevo binding, donde se tome como base los elementos existentes para que sea mucho más sencillo crearlo.

 

Por este motivo, en este artículo veremos un ejemplo bastante simple de cómo crear un binding personalizado y que puedas reutilizarlo para futuras implementaciones.

 

El requerimiento que tenemos es la necesidad de un binding que exponga texto sobre TCP, ninguno de los predefinidos lo soporta entonces vamos a crear una nueva clase.

 

Para resolverlo y probarlo vamos a crear un proyecto de tipo WCF Service Library

En nuestro proyecto vamos a incluir una clase en donde vamos a definir la implementación de nuestro binding personalizado, incluye el siguiente código:

 

public class NetTcpTextBinding : Binding

    {

        private TcpTransportBindingElement transport;

        private TextMessageEncodingBindingElement encoding;

        public NetTcpTextBinding()

            : base()

        {

            this.Initialize();

        }

        public override BindingElementCollection CreateBindingElements()

        {

            BindingElementCollection elements = new BindingElementCollection();

            elements.Add(this.encoding);

            elements.Add(this.transport);

            return elements;

        }

        public override string Scheme

        {

            get { return this.transport.Scheme; }

        }

        private void Initialize()

        {

            this.transport = new TcpTransportBindingElement();

            this.encoding = new TextMessageEncodingBindingElement();

        }

    }

 

En el código, la nueva clase hereda de una clase base abstracta llamada Binding, la cual nos da implementación común a cualquier binding.

 

Además, se incluye explícitamente los valores de transporte y codificación para este binding, los cuales recordamos son TCP y texto.

 

Una vez que ya lo tenemos configurado, lo podemos utilizar para exponerlo programáticamente con un código como el siguiente:

 

NetTcpTextBinding binding = new NetTcpTextBinding();

            ServiceHost host = new ServiceHost(typeof(Service1));

            host.AddServiceEndpoint(typeof(IService1),

            binding,

            "net.tcp://localhost:10101/IService");

            host.Open();

 

Ahora, para efecto de probarlo y poderlo utilizar desde nuestro archivo de configuración vamos a incluir las siguientes líneas de código en nuestra clase previamente definida:

 

public class NetTcpTextBindingCollectionElement : BindingCollectionElement

    {

        public override Type BindingType

        {

            get { return typeof(NetTcpTextBinding); }

        }

        public override ReadOnlyCollection<IBindingConfigurationElement>

        ConfiguredBindings

        {

            get

            {

                return new ReadOnlyCollection<IBindingConfigurationElement>(

                new List<IBindingConfigurationElement>());

            }

        }

        public override bool ContainsKey(string name)

        {

            throw new NotImplementedException();

        }

        protected override Binding GetDefault()

        {

            return new NetTcpTextBinding();

        }

        protected override bool TryAdd(

        string name, Binding binding, Configuration config)

        {

            throw new NotImplementedException();

        }

    }

 

Con este código podemos utilizar nuestro binding desde el archivo de configuración; para completar y ver un resultado vamos a realizar las siguientes modificaciones a nuestro archivo de configuración:

 

<system.serviceModel>

    <extensions>

      <bindingExtensions>

        <add name="netTcpTextBinding"        type="WCFCustomBindings.NetTcpTextBindingCollectionElement,WCFCustomBindings,

Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

      </bindingExtensions>

    </extensions>

    <services>

      <service name="WCFCustomBindings.Service1" behaviorConfiguration="WCFCustomBindings.Service1Behavior">

        <endpoint address="net.tcp://localhost:10101/IService" binding="netTcpTextBinding" contract="WCFCustomBindings.IService1">

        </endpoint>

         

        <endpoint address="net.tcp://localhost:10101/IService/mex" binding="mexTcpBinding" contract="IMetadataExchange"/>

      </service>

    </services>

    <behaviors>

      <serviceBehaviors>

        <behavior name="WCFCustomBindings.Service1Behavior">

          <!-- To avoid disclosing metadata information,

          set the value below to false and remove the metadata endpoint above before deployment -->

          <serviceMetadata/>

          <!-- To receive exception details in faults for debugging purposes,

          set the value below to true.  Set to false before deployment

          to avoid disclosing exception information -->

          <serviceDebug includeExceptionDetailInFaults="False" />

        </behavior>

      </serviceBehaviors>

    </behaviors>

  </system.serviceModel>

 

En la parte de extensions se ha dado de alta para poder utilizar en la configuración a nuestro binding y así poderlo referenciar, una vez cumplido esto se da de alta el endpoint con la información de nuestro binding y listo, ejecuta y comprueba:

 

 

Ahora ya conoces como personalizar un binding en WCF, con esto no tendremos limitantes en decidir la manera en la cual queremos exponer nuestro servicio.

 

Esperando esta nota sea de utilidad, recuerda el código lo puedes descargar desde aquí.

 

Comentarios, bienvenidos.

 

Nos encontramos en la próxima.

 

 

 


Posted 11-16-2010 5:32 PM by Marcos
Filed under: , ,
Powered by Community Server (Non-Commercial Edition), by Telligent Systems