Création d'un élément de liaison
Les liaisons et les éléments de liaison (qui étendent respectivement les objets System.ServiceModel.Channels.Binding et System.ServiceModel.Channels.BindingElement) correspondent à l'emplacement où le modèle d'application Windows Communication Foundation (WCF) est associé aux fabrications de canaux ainsi qu'aux écouteurs de canal. Sans liaisons, l'utilisation des canaux personnalisés nécessite une programmation de niveau canal comme expliqué dans Programmation de service au niveau du canal et Programmation au niveau du canal client. Cette rubrique aborde les spécifications minimales vous permettant d'utiliser vos canaux dans WCF, de développer un BindingElement pour ceux-ci et de les utiliser à partir d'applications, comme expliqué à l'étape 4 de Développement de canaux.
Vue d'ensemble
La création d'un BindingElement pour votre canal permet aux développeurs de l'utiliser dans une application WCF. Les objets BindingElement peuvent être utilisés à partir de la classe System.ServiceModel.ServiceHost afin de connecter une application WCF à votre canal sans que vous ayez besoin d'indiquer les informations de type de ce dernier.
Une fois l'élément BindingElement créé, vous pouvez activer des fonctionnalités supplémentaires selon vos spécifications en vous conformant aux autres étapes figurant dans Développement de canaux.
Ajout d'un élément de liaison
Pour implémenter un élément BindingElementpersonnalisé, écrivez une classe qui hérite de BindingElement. Par exemple, si vous avez développé un canal ChunkingChannel
capable de fragmenter de grands messages en plusieurs segments, puis de les recomposer en fin de traitement, vous pouvez utiliser ce canal sur n'importe quelle liaison en implémentant un élément BindingElement et en configurant la liaison de sorte à ce qu'elle puisse utiliser ce dernier. Un canal ChunkingChannel
est utilisé à titre d'exemple dans cette rubrique afin d'illustrer les spécifications requises à l'implémentation d'un élément de liaison.
L'élément ChunkingBindingElement
est chargé de créer la fabrication ChunkingChannelFactory
et l'écouteur ChunkingChannelListener
. Cet élément se substitue aux implémentations CanBuildChannelFactory et CanBuildChannelListener et s'assure que le paramètre de type correspond à IDuplexSessionChannel (il s'agit de la seule forme de canal prise en charge par notre exemple de canal ChunkingChannel
) et que les autres éléments de liaison dans la liaison prennent effectivement en charge cette forme de canal.
BuildChannelFactory vérifie au préalable que la forme de canal demandée peut être construite, puis récupère une liste d'actions de message à fragmenter. Cette méthode crée ensuite une fabrication ChunkingChannelFactory
en lui passant la fabrication de canal interne. Remarque : si vous créez un élément de liaison de transport, cet élément est le dernier dans la pile de liaison. Vous devez, par conséquent, créer un écouteur de canal ou une fabrication de canal.
BuildChannelListener utilise une implémentation similaire pour créer ChunkingChannelListener
et lui passer l'écouteur de canal interne.
Dans le cadre d'un canal de transport, Transport: UDP, par exemple, effectue la substitution suivante.
Dans notre exemple, l'élément de liaison est UdpTransportBindingElement
, lequel dérive de TransportBindingElement. Dans le code ci-dessous se rapportant à notre exemple, les méthodes suivantes sont substituées pour générer les fabrications associées au canal.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
Notre exemple contient également des membres permettant de cloner l'élément BindingElement
et de retourner le schéma (soap.udp).
Protocole d'éléments de liaison
Les nouveaux éléments de liaison peuvent remplacer ou augmenter tout élément de liaison inclus en ajoutant de nouveaux transports, encodages ou protocoles de niveau supérieur. Pour créer un nouvel élément de liaison de protocole, commencez par étendre la classe BindingElement. Vous devez ensuite implémenter au minimum la méthode System.ServiceModel.Channels.BindingElement.Clone ainsi que ChannelProtectionRequirements en utilisant la méthode System.ServiceModel.Channels.IChannel.GetProperty. Cette opération retourne ChannelProtectionRequirements pour l'élément de liaison défini. Pour plus d'informations, consultez ChannelProtectionRequirements.
Clone doit retourner une nouvelle copie de cet élément de liaison. Dans le cadre de nos meilleures pratiques, nous vous recommandons d'implémenter, en tant que créateur de cet élément de liaison, la méthode Clone à l'aide d'un constructeur de copie qui appelle le constructeur de copie de base, puis clone tous les champs supplémentaires figurant dans cette classe.
Éléments de liaison de transport
Pour créer un nouvel élément de liaison de transport, étendez l'interface TransportBindingElement. Vous devez ensuite implémenter au minimum la méthode Clone et la propriété System.ServiceModel.Channels.TransportBindingElement.Scheme.
Clone doit retourner une nouvelle copie de cet élément de liaison. Dans le cadre de nos meilleures pratiques, nous vous recommandons d'implémenter, en tant que créateur de cet élément de liaison, la méthode de clonage à l'aide d'un constructeur de copie qui appelle le constructeur de copie de base, puis clone tous les champs supplémentaires figurant dans cette classe.
Propriété Scheme : la propriété Get Scheme retourne le modèle URI correspondant au protocole de transport représenté par l'élément de liaison. Par exemple, System.ServiceModel.Channels.HttpTransportBindingElement et System.ServiceModel.Channels.TcpTransportBindingElement retournent « http » et « net.tcp » à partir de leurs propriétés Scheme respectives.
Éléments de liaison d'encodage
Pour créer un nouvel élément de liaison d'encodage, commencez par étendre la classe BindingElement et implémenter la classe System.ServiceModel.Channels.MessageEncodingBindingElement. Vous devez ensuite implémenter au minimum les méthodes Clone, System.ServiceModel.Channels.MessageEncodingBindingElement.CreateMessageEncoderFactory ainsi que la propriété System.ServiceModel.Channels.MessageEncodingBindingElement.MessageVersion.
Clone. Retourne une nouvelle copie de cet élément de liaison. Dans le cadre de nos meilleures pratiques, nous vous recommandons d'implémenter, en tant que créateur de cet élément de liaison, la méthode Clone à l'aide d'un constructeur de copie qui appelle le constructeur de copie de base, puis clone tous les champs supplémentaires figurant dans cette classe.
CreateMessageEncoderFactory. Retourne une fabrication MessageEncoderFactory qui fournit un handle à la classe effective, laquelle implémente votre nouvel encodeur et doit étendre MessageEncoder. Pour plus d'informations, consultez MessageEncoderFactory et MessageEncoder.
MessageVersion. Retourne la version MessageVersion utilisée dans cet encodage, laquelle correspond aux versions de SOAP et WS-Addressing utilisées.
Pour une liste exhaustive des méthodes et propriétés optionnelles compatibles avec les éléments de liaison d'encodage définis par l'utilisateur, consultez MessageEncodingBindingElement.
Pour plus d'informations sur la création d'un élément de liaison, consultez Création de liaisons définies par l'utilisateur.
Une fois l'élément de liaison de votre canal créé, consultez à nouveau la rubrique Développement de canaux si vous souhaitez ajouter une prise en charge du fichier de configuration ou une prise en charge de la publication des métadonnées à votre élément de liaison ou construire une liaison définie par l'utilisateur utilisant votre élément de liaison.