Creación de enlaces definidos por el usuario
Hay varias maneras de crear enlaces no proporcionadas por el sistema:
Cree un enlace personalizado, basado en la clase CustomBinding, que es un contenedor que rellena de elementos de enlace. El enlace personalizado se agrega a continuación a un punto de conexión de servicio. Puede crear el enlace personalizado mediante programación o mediante un archivo de configuración de la aplicación. Para usar un elemento de enlace desde un archivo de configuración de la aplicación, el elemento de enlace debe extenderse BindingElementExtensionElement. Para obtener más información sobre los enlaces personalizados, consulte Enlaces personalizados y CustomBinding.
Puede crear una clase que derive de un enlace estándar. Por ejemplo, puede derivar una clase de WSHttpBinding e invalidar el método CreateBindingElements para obtener los elementos de enlace e insertar un elemento de enlace personalizado o establecer un valor determinado de seguridad.
Puede crear un nuevo tipo Binding para controlar completamente toda la implementación del enlace.
El orden de elementos de enlace
Cada elemento de enlace representa un paso del procesamiento al enviar y recibir mensajes. En tiempo de ejecución, los elementos de enlace crean los canales y clientes de escucha necesarios para compilar pilas de canales entrantes y salientes.
Hay tres tipos principales de elementos de enlace: elementos de enlaces de protocolo, elementos de enlaces de codificación y elementos de enlaces de transporte.
Elementos de enlaces protocolares: estos elementos representan pasos de procesamiento de nivel superior que actúan sobre mensajes. Los canales y los agentes de escucha creados por estos elementos de enlace pueden agregar, quitar o modificar el contenido del mensaje. Un enlace determinado puede tener un número arbitrario de elementos de enlace de protocolo, cada uno de los cuales hereda de BindingElement. Windows Communication Foundation (WCF) incluye varios elementos de enlace de protocolo, como ReliableSessionBindingElement y SymmetricSecurityBindingElement.
Elemento de enlace de codificación: estos elementos representan las transformaciones entre un mensaje y una codificación lista para la transmisión en la conexión. Los enlaces típicos WCF incluyen exactamente un elemento de enlace de codificación. Entre los ejemplos de elementos de enlace de codificación se incluyen los elementos MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElement y TextMessageEncodingBindingElement. Si no se especifica un elemento de enlace de codificación para un enlace, se utiliza una codificación predeterminada. Cuando el transporte es HTTP, el valor predeterminado es texto, y, si no fuese HTTP, es binario.
Elemento de enlace de transporte: estos elementos representan la transmisión de un mensaje de codificación sobre un protocolo de transporte. Los enlaces típicos WCF incluyen exactamente un elemento de enlace de transporte, que hereda de TransportBindingElement. Entre los ejemplos de elementos de enlace del transporte se incluyen los elementos TcpTransportBindingElement, HttpTransportBindingElement y NamedPipeTransportBindingElement.
Al crear nuevos enlaces, el orden de los elementos de enlace agregados es importante. Siempre agregue los elementos de enlace en el siguiente orden:
Nivel | Opciones | Obligatorio |
---|---|---|
Flujo de transacciones | System.ServiceModel.Channels.TransactionFlowBindingElement | No |
Confiabilidad | System.ServiceModel.Channels.ReliableSessionBindingElement | No |
Seguridad | System.ServiceModel.Channels.SecurityBindingElement | No |
Dúplex compuesto | System.ServiceModel.Channels.CompositeDuplexBindingElement | No |
Encoding | Texto, binario, MTOM, personalizado | Sí* |
Transporte | TCP, canalizaciones con nombre, HTTP, HTTPS, MSMQ, personalizado | Sí |
*Dado que se necesita una codificación para cada enlace, si no se especifica una codificación, WCF agrega una predeterminada. El valor predeterminado es texto/XML para los transportes HTTP y HTTPS, y binario para otros transportes.
Creación de un nuevo elemento de enlace
Además de los tipos que derivan de BindingElement, que proporciona WCF, puede crear sus propios elementos de enlace. Esto le permite personalizar la manera en la que se crea la pila de enlaces y los componentes que van en ella creando su propio BindingElement que puede componerse con el resto de tipos proporcionados por el sistema en la pila.
Por ejemplo, si implementa un LoggingBindingElement
que proporciona la capacidad de registrar el mensaje en una base de datos, debe colocarlo sobre un canal de transporte en la pila de canales. En este caso, la aplicación crea un enlace personalizado que compuso el LoggingBindingElement
con TcpTransportBindingElement
, como en el siguiente ejemplo.
Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);
La forma en la que escribe su nuevo elemento de enlace depende de su funcionalidad exacta. Uno de los ejemplos, Transporte: UDP, proporciona una descripción detallada sobre cómo implementar un tipo de elemento de enlace.
Crear un nuevo enlace
Un elemento de enlace creado por el usuario se puede utilizar de dos maneras. La sección anterior muestra la primera manera: a través de un enlace personalizado. Un enlace personalizado le permite al usuario crear su propio enlace en función de un conjunto arbitrario de elementos de enlace, incluso los creados por usuario.
Si utiliza el enlace en más de una aplicación, cree su propio enlace y extienda el Binding. Esto evita crear manualmente un enlace personalizado cada vez que desee utilizarlo. Un enlace definido por el usuario le permite definir el comportamiento del enlace e incluir elementos de enlace definidos por el usuario. Y está preempaquetado: no tiene que recompilar el enlace cada vez que lo use.
Como mínimo, un enlace definido por el usuario deberá implementar el método CreateBindingElements y la propiedad Scheme.
El método CreateBindingElements devuelve un nuevo BindingElementCollection que contiene los elementos de enlace del enlace. Se ordena la colección y debería contener primero los elementos de enlace protocolares, seguidos por el elemento de enlace de la codificación, seguido por el elemento de enlace de transporte. Al usar los elementos de enlace que proporciona el sistema WCF, debe seguir las reglas de ordenamiento de elementos de enlace que se especifican en Enlaces personalizados. Esta colección nunca debería hacer referencia a objetos a los que se ha hecho referencia dentro de la clase de enlace definida por el usuario; por consiguiente, los autores de enlaces deben devolver un Clone()
de la BindingElementCollection en cada llamada a CreateBindingElements.
La propiedad Scheme representa el esquema del URI para el protocolo de transporte que se está utilizando en el enlace. Por ejemplo, WSHttpBinding y NetTcpBinding devuelven "http" y "net.tcp" a partir de sus propiedades Schemerespectivas.
Para obtener una lista completa de métodos y propiedades opcionales para los enlaces definidos por el usuario, vea Binding.
Ejemplo
Este ejemplo implementa el enlace del perfil en SampleProfileUdpBinding
, que deriva de Binding. SampleProfileUdpBinding
contiene hasta cuatro elementos de enlace dentro: un UdpTransportBindingElement
creado por el usuario; y tres TextMessageEncodingBindingElement
que proporciona el sistema, CompositeDuplexBindingElement
y ReliableSessionBindingElement
.
public override BindingElementCollection CreateBindingElements()
{
BindingElementCollection bindingElements = new BindingElementCollection();
if (ReliableSessionEnabled)
{
bindingElements.Add(session);
bindingElements.Add(compositeDuplex);
}
bindingElements.Add(encoding);
bindingElements.Add(transport);
return bindingElements.Clone();
}
Restricciones de Seguridad con contratos dúplex
No todos los elementos de enlace son compatibles entre sí. En concreto, hay algunas restricciones con respecto a elementos de enlaces de seguridad cuando se utilizan con contratos dúplex.
Seguridad monoestable
Puede implementar la seguridad "monoestable", con la que todas las credenciales de seguridad necesarias se envían en un único mensaje; para ello, establezca el atributo negotiateServiceCredential
del elemento de configuración del <mensaje> en false
.
La autenticación monoestable no trabaja con contratos dúplex.
Para contratos de solicitud-respuesta, la autenticación monoestable solo funciona si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel o IRequestSessionChannel.
Para contratos unidireccionales, la autenticación monoestable funciona si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel, IRequestSessionChannel, IOutputChannel o IOutputSessionChannel.
Tokens de contexto de seguridad de modo de cookie
Los tokens de contexto de seguridad de modo de cookie no se pueden utilizar con contratos dúplex.
Para contratos de solicitud-respuesta, los tokens de contexto de seguridad del modo de cookie solo funcionan si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel o IRequestSessionChannel.
Para contratos unidireccionales, los tokens de contexto de seguridad del modo de cookie funcionan si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel o IRequestSessionChannel.
Tokens de contexto de seguridad de modo de sesión
El SCT de modo de sesión funciona con contratos dúplex si la pila de enlaces bajo el elemento de enlace de seguridad permite crear instancias de IDuplexChannel o IDuplexSessionChannel.
El SCT de modo de sesión funciona con contratos de solicitud-respuesta si la pila de enlaces bajo el elemento de enlace de seguridad permite crear instancias de IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.
El SCT de modo de sesión funciona con contratos unidireccionales si la pila de enlaces bajo el elemento de enlace de seguridad permite crear instancias de IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.
Derivación a partir de un enlace estándar
En lugar de crear una clase de enlace completamente nueva, puede que sea posible extender uno de los enlaces existentes proporcionados por el sistema. De manera muy similar al caso anterior, debe invalidar el método CreateBindingElements y la propiedad Scheme.