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: