Création de liaisons définies par l’utilisateur
Il existe plusieurs méthodes pour créer des liaisons non fournies par le système :
Créez une liaison personnalisée basés sur la classe CustomBinding qui est un conteneur que vous remplissez avec les éléments de liaison. La liaison personnalisée est ensuite ajoutée à un point de terminaison de service. Vous pouvez créer la liaison personnalisée soit par programmation soit dans un fichier de configuration d’application. Pour utiliser un élément de liaison d’un fichier de configuration d’application, l’élément doit étendre les liaisons personnalisées BindingElementExtensionElement. Pour plus d’informations sur les liaisons personnalisées, consultez Liaisons personnalisées et CustomBinding.
Vous pouvez créer une classe qui dérive d’une liaison standard. Par exemple, vous pouvez dériver une classe de WSHttpBinding et remplacer la méthode CreateBindingElements pour obtenir les éléments de liaison et insérer un élément de liaison personnalisé ou établir une valeur particulière pour la sécurité.
Vous pouvez créer un nouveau type Binding pour contrôler complètement l’ensemble de l’implémentation de la liaison.
Ordre des éléments de liaison
Chaque élément de liaison représente une étape de traitement lors de l’envoi ou de la réception des messages. Au moment de l’exécution, les éléments de liaison créent les canaux et les écouteurs nécessaires pour générer des piles de canaux entrants et sortants.
Il y a trois types principaux d'éléments de liaison : les éléments de liaison de protocole, les éléments de liaison d'encodage et les éléments de liaison de transport.
Éléments de liaison de protocole – Ces éléments représentent des étapes de traitement de niveau supérieur qui agissent sur les messages. Les canaux et les écouteurs créés par ces éléments de liaison peuvent ajouter, supprimer ou modifier le contenu du message. Une liaison donnée peut avoir un nombre arbitraire d’éléments de liaison de protocole, chacun héritant d’un objet BindingElement. Windows Communication Foundation (WCF) inclut plusieurs éléments de liaison de protocole, dont ReliableSessionBindingElement et SymmetricSecurityBindingElement.
Élément de liaison d’encodage – Ces éléments représentent des transformations entre un message et un encodage prêt pour la transmission sur le fil. Les liaisons WCF typiques incluent exactement un élément de liaison d’encodage. Des exemples d’éléments de liaison d’encodage incluent MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElement et TextMessageEncodingBindingElement. Si un élément de liaison d'encodage n'est pas spécifié pour une liaison, un encodage par défaut est utilisé. La valeur par défaut est Text lorsque le transport est HTTP, sinon la valeur est Binary.
Élément de liaison de transport – Ces éléments représentent la transmission d’un message d’encodage sur un protocole de transport. Les liaisons WCF typiques incluent exactement un élément de liaison de transport, qui hérite de TransportBindingElement. Des exemples d’éléments de liaison de transport incluent TcpTransportBindingElement, HttpTransportBindingElement et NamedPipeTransportBindingElement.
Lors de la création de nouvelles liaisons, l’ordre des éléments de liaison ajoutés est important. Ajoutez toujours les éléments de liaison dans l'ordre suivant :
Couche | Options | Obligatoire |
---|---|---|
Flux de transaction | System.ServiceModel.Channels.TransactionFlowBindingElement | Non |
Fiabilité | System.ServiceModel.Channels.ReliableSessionBindingElement | Non |
Sécurité | System.ServiceModel.Channels.SecurityBindingElement | Non |
Duplex composite | System.ServiceModel.Channels.CompositeDuplexBindingElement | Non |
Encodage | Text, Binary, MTOM, Custom | Oui* |
Transport | TCP, Named Pipes, HTTP, HTTPS, MSMQ, Custom | Oui |
*Étant donné qu’un encodage est requis pour chaque liaison, WCF en ajoute automatiquement un par défaut si vous n’en avez pas spécifié. La valeur par défaut est Text/XML pour les transports HTTP et HTTPS, et Binary pour les autres transports.
Création d’un nouvel élément de liaison
En plus des types dérivés de BindingElement fournis par WCF, vous pouvez créer vos propres éléments de liaison. Vous pouvez personnaliser la façon dont la pile des liaisons est créée et les composants qu'elle inclut en créant votre propre BindingElement qui peut être composé dans la pile avec les autres types fournis par le système.
Par exemple, si vous implémentez un LoggingBindingElement
qui fournit la capacité d'enregistrer le message dans une base de données, vous devez le placer au-dessus d'un canal de transport dans la pile des canaux. Dans ce cas, l'application crée une liaison personnalisée qui compose le LoggingBindingElement
avec TcpTransportBindingElement
, comme dans l'exemple suivant.
Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);
La façon dont vous écrivez votre nouvel élément de liaison dépend de ses fonctionnalités exactes. L’un des exemples, Transport : UDP, fournit une description détaillée de la façon d’implémenter un type d’élément de liaison.
Création d’une nouvelle liaison
Un élément de liaison créé par l’utilisateur peut être utilisé de deux façons. La section précédente illustre la première méthode : via une liaison personnalisée. Une liaison personnalisée permet à l’utilisateur de créer sa propre la liaison basée sur un jeu arbitraire d’éléments de liaison, y compris ceux créés par l’utilisateur.
Si vous utilisez la liaison dans plusieurs applications, créez votre propre liaison et étendez Binding. Cela évite de créer manuellement une liaison personnalisée à chaque fois que vous souhaitez l’utiliser. Une liaison définie par l’utilisateur vous permet de définir le comportement de la liaison et d’inclure des éléments de liaison définis par l’utilisateur. De plus, elle est prépackagée : vous n’avez pas à regénérer la liaison chaque fois que vous l’utilisez.
Au minimum, une liaison définie par l’utilisateur doit implémenter la méthode CreateBindingElements et la propriété Scheme.
La méthode CreateBindingElements retourne un nouveau BindingElementCollection qui contient les éléments de liaison pour la liaison. La collection est ordonnée et doit contenir en premier les éléments de liaison de protocole, suivis par l'élément de liaison d'encodage, suivi par l'élément de liaison de transport. Lorsque vous utilisez les éléments de liaison fournis par le système WCF, vous devez suivre les règles de classement des éléments de liaison spécifiées dans Liaisons personnalisées. Cette collection ne doit jamais référencer des objets référencés dans la classe de liaison définie par l’utilisateur ; par conséquent, les auteurs de la liaison doivent retourner un Clone()
de BindingElementCollection sur chaque appel à CreateBindingElements.
La propriété Scheme représente le modèle URI pour le protocole de transport utilisé sur la liaison. Par exemple, WSHttpBinding et NetTcpBinding retournent « http » et « net.tcp » à partir de leurs propriétés Scheme respectives.
Pour une liste exhaustive des méthodes et des propriétés optionnelles relatives aux liaisons définies par l'utilisateur, consultez Binding.
Exemple
Cet exemple implémente la liaison de profil dans SampleProfileUdpBinding
, lequel dérive de Binding. SampleProfileUdpBinding
contient jusqu’à quatre éléments de liaison : un élément UdpTransportBindingElement
créé par l’utilisateur et trois éléments TextMessageEncodingBindingElement
, CompositeDuplexBindingElement
et ReliableSessionBindingElement
fournis par le système.
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();
}
Restrictions de sécurité avec les contrats duplex
Tous les éléments de liaison ne sont pas compatibles les uns avec les autres. Notamment, il existe des restrictions concernant les éléments de liaison de sécurité en cas d'utilisation avec les contrats duplex.
Sécurité « one-shot »
Vous pouvez implémenter une sécurité « one-shot », pour laquelle toutes les informations d’identification nécessaires sont envoyées dans un message unique, en définissant l’attribut negotiateServiceCredential
de l’élément de configuration <message> sur false
.
L'authentification « one-shot » ne fonctionne pas avec les contrats duplex.
Pour les contrats de demande-réponse, l’authentification « one-shot » fonctionne uniquement si la pile des liaisons au-dessous de l’élément de liaison de sécurité prend en charge la création d’instances IRequestChannel ou IRequestSessionChannel.
Pour les contrats unidirectionnels, l’authentification « one-shot » fonctionne si la pile des liaisons au-dessous de l’élément de liaison de sécurité prend en charge la création d’instances IRequestChannel, IRequestSessionChannel, IOutputChannel ou IOutputSessionChannel.
Jetons de contexte de sécurité en mode Cookie
Les jetons de contexte de sécurité en mode Cookie ne peuvent pas être utilisés avec les contrats duplex.
Pour les contrats de demande-réponse, les jetons de contexte de sécurité en mode Cookie fonctionnent uniquement si la pile des liaisons au-dessous de l'élément de liaison de sécurité prend en charge la création d'instances IRequestChannel ou IRequestSessionChannel.
Pour les contrats unidirectionnels, les jetons de contexte de sécurité en mode Cookie fonctionnent si la pile des liaisons au-dessous de l'élément de liaison de sécurité prend en charge la création d'instances IRequestChannel ou IRequestSessionChannel.
Jetons de contexte de sécurité en mode session
Le jeton de contexte de sécurité en mode session fonctionne pour les contrats duplex si la pile des liaisons au-dessous de l’élément de liaison de sécurité prend en charge la création d’instances IDuplexChannel ou IDuplexSessionChannel.
Le jeton de contexte de sécurité en mode session fonctionne pour les contrats de demande-réponse si la pile des liaisons au-dessous de l'élément de liaison de sécurité prend en charge la création d'instances IDuplexChannel, IDuplexSessionChannel, IRequestChannel ou IRequestSessionChannel.
Le jeton de contexte de sécurité en mode session fonctionne pour les contrats unidirectionnels si la pile des liaisons au-dessous de l’élément de liaison de sécurité prend en charge la création d’instances IDuplexChannel, IDuplexSessionChannel, IRequestChannel ou IRequestSessionChannel.
Dérivation à partir d’une liaison standard
Au lieu de créer une classe de liaison totalement nouvelle, il est possible d’étendre l’une des liaisons fournies par le système existantes. Comme dans le cas précédent, vous devez substituer la méthode CreateBindingElements et la propriété Scheme.