Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Hay varias maneras de crear enlaces no proporcionados por el sistema:
Cree un enlace personalizado basado en la clase CustomBinding, la cual es un contenedor que se rellena con elementos de enlace. A continuación, la vinculación personalizada se agrega a un punto de acceso del servicio. Puede crear el enlace personalizado mediante programación o en 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 extender BindingElementExtensionElement. Para obtener más información sobre los enlaces personalizados, vea Enlaces personalizados y CustomBinding.
Puede crear una clase que derive de un enlace estándar. Por ejemplo, puede derivar una clase del WSHttpBinding método e invalidar CreateBindingElements para obtener los elementos de enlace e insertar un elemento de enlace personalizado o establecer un valor determinado para la seguridad.
Puede crear un Binding de tipo nuevo para controlar completamente la implementación completa de la vinculación.
El orden de los elementos de enlace
Cada elemento de enlace representa un paso de procesamiento al enviar o 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 enlace de protocolo, Elementos de enlace de codificación y Elementos de enlace de transporte.
Elementos de enlace de protocolo: estos elementos representan pasos de procesamiento de nivel superior que actúan en los 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, incluso el ReliableSessionBindingElement y el SymmetricSecurityBindingElement.
Elemento de vinculación de codificación: estos elementos representan transformaciones entre un mensaje y una codificación lista para la transmisión por cable. Los enlaces WCF típicos incluyen exactamente un elemento de enlace de codificación. Entre los ejemplos de elementos de enlace de codificación se incluyen el MtomMessageEncodingBindingElement, el BinaryMessageEncodingBindingElement y el TextMessageEncodingBindingElement. Si no se especifica un elemento de enlace de codificación para un enlace, se usa una codificación predeterminada. El valor predeterminado es texto cuando el transporte es HTTP y binario en caso contrario.
Elemento de enlace de transporte: estos elementos representan la transmisión de un mensaje de codificación en un protocolo de transporte. Los enlaces WCF típicos incluyen exactamente un elemento de enlace de transporte, que hereda de TransportBindingElement. Entre los ejemplos de elementos de enlace de transporte se incluyen TcpTransportBindingElement, HttpTransportBindingElement y NamedPipeTransportBindingElement.
Al crear nuevos enlaces, es importante el orden de los elementos de enlace agregados. Agregue siempre elementos de enlace en el orden siguiente:
Nivel | Opciones | Obligatorio |
---|---|---|
Flujo de transacciones | System.ServiceModel.Channels.TransactionFlowBindingElement | No |
Fiabilidad | System.ServiceModel.Channels.ReliableSessionBindingElement | No |
Seguridad | System.ServiceModel.Channels.SecurityBindingElement | No |
Dúplex compuesto | System.ServiceModel.Channels.CompositeDuplexBindingElement | No |
Codificación | Texto, binario, MTOM, personalizado | Sí* |
Transporte | TCP, canalizaciones con nombre, HTTP, HTTPS, MSMQ, personalizado | Sí |
*Dado que se requiere una codificación para cada enlace, si no se especifica una codificación, WCF agrega una codificación predeterminada. El valor predeterminado es Text/XML para los transportes HTTP y HTTPS y Binary en caso contrario.
Creación de un nuevo elemento de enlace
Además de los tipos derivados 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 encima de un canal de transporte en la pila de canales. En este caso, la aplicación crea un enlace personalizado que compone LoggingBindingElement
con TcpTransportBindingElement
, como en el siguiente ejemplo.
Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);
La forma de escribir el nuevo elemento de enlace depende de su funcionalidad exacta. Uno de los ejemplos, Transport: UDP, proporciona una descripción detallada de cómo implementar un tipo de elemento de enlace.
Creación de una nueva vinculación
Un elemento de enlace creado por el usuario se puede usar de dos maneras. La sección anterior muestra la primera manera: a través de un enlace personalizado. Un enlace personalizado permite al usuario crear su propio enlace basado en un conjunto arbitrario de elementos de enlace, incluidos los creados por el 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 quiera usarlo. Un enlace definido por el usuario permite definir el comportamiento del enlace e incluir elementos de enlace definidos por el usuario. Y está preempaquetado: no es necesario reconstruir el enlace cada vez que lo use.
Como mínimo, un enlace definido por el usuario debe implementar el CreateBindingElements método y la Scheme propiedad .
El CreateBindingElements método devuelve un nuevo BindingElementCollection que contiene los elementos de enlace para el enlace. La colección se ordena y debe contener primero los elementos de enlace de protocolo, seguidos del elemento de enlace de codificación, seguido del elemento de enlace de transporte. Al usar los elementos de enlace proporcionados por el sistema WCF, debe seguir las reglas de ordenación de elementos de enlace especificadas 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 Scheme propiedad representa el esquema URI del protocolo de transporte en uso en el enlace. Por ejemplo, WSHttpBinding y NetTcpBinding devuelven "http" y "net.tcp" de sus respectivas Scheme propiedades.
Para obtener una lista completa de métodos y propiedades opcionales para enlaces definidos por el usuario, vea Binding.
Ejemplo
En este ejemplo se implementa el enlace de perfil en SampleProfileUdpBinding
, que deriva de Binding.
SampleProfileUdpBinding
contiene hasta cuatro elementos de enlace dentro de él: un usuario creadoUdpTransportBindingElement
; y tres proporcionados por el sistema: TextMessageEncodingBindingElement
, 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.
One-Shot Seguridad
Puede implementar la seguridad "one-shot", donde todas las credenciales de seguridad necesarias se envían en un único mensaje, configurando el atributo negotiateServiceCredential
del elemento < de configuración del mensaje > a false
.
La autenticación de una sola vez no funciona con contratos dúplex.
En el caso de los contratos de Request-Reply, la autenticación de un solo uso solo funciona si la pila de enlaces debajo del elemento de enlace de seguridad soporta crear instancias de IRequestChannel o IRequestSessionChannel.
Para los contratos unidireccionales, la autenticación de una sola vez funciona si la pila de enlaces debajo del 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 en modo cookie no se pueden utilizar con contratos de tipo dúplex.
Para contratos Request-Reply, los tokens de contexto de seguridad en modo cookie solo funcionan si la serie de enlaces debajo del elemento de enlace de seguridad admite la creación de instancias de IRequestChannel o IRequestSessionChannel.
Para contratos unidireccionales, los tokens de contexto de seguridad en modo cookie funcionan si la pila de enlaces, debajo del 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 modo de sesión SCT funciona para contratos dúplex si la pila de enlaces debajo del elemento de enlace de seguridad admite la creación de instancias de IDuplexChannel o IDuplexSessionChannel.
El modo de sesión SCT funciona para contratos Request-Reply si la pila de enlaces, debajo del elemento de enlace de seguridad, admite la creación de instancias IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.
El modo de sesión SCT funciona para contratos 1-way si la pila de enlaces debajo del elemento de enlace de seguridad admite la creación de instancias 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 pueda ampliar uno de los enlaces proporcionados por el sistema existentes. De manera muy similar al caso anterior, debe invalidar el método CreateBindingElements y la propiedad Scheme.