Partager via


Création de liaisons définies par l’utilisateur

Il existe plusieurs façons de créer des liaisons non fournies par le système :

  • Créez une liaison personnalisée, basée sur la CustomBinding classe, qui est un conteneur que vous remplissez avec des é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 par programmation ou dans un fichier de configuration d’application. Pour utiliser un élément de liaison à partir d’un fichier de configuration d’application, l’élément de liaison doit s’étendre 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 redéfinir la méthode CreateBindingElements pour obtenir les éléments de liaison, insérer un élément de liaison personnalisé ou établir une valeur particulière pour la sécurité.

  • Vous pouvez créer un nouveau Binding type pour contrôler complètement l’ensemble de l’implémentation de 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 de messages. Au moment de l’exécution, les éléments de liaison créent les canaux et les récepteurs nécessaires pour construire des piles de canaux sortantes et entrantes.

Il existe trois types principaux d’éléments de liaison : éléments de liaison de protocole, éléments de liaison d’encodage et é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érite de BindingElement. Windows Communication Foundation (WCF) inclut plusieurs éléments de liaison de protocole, notamment le ReliableSessionBindingElement et le 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 câble. Les liaisons WCF classiques incluent exactement un élément de liaison d’encodage. Parmi les exemples d’éléments de liaison d’encodage, on trouve 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 le texte lorsque le transport est HTTP et binaire dans le cas contraire.

É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 classiques incluent exactement un élément de liaison de transport, qui hérite de TransportBindingElement. Parmi les exemples d’éléments de liaison de transport, on trouve le TcpTransportBindingElement, le HttpTransportBindingElement et le NamedPipeTransportBindingElement.

Lors de la création de nouvelles liaisons, l’ordre des éléments de liaison ajoutés est important. Ajoutez toujours des éléments de liaison dans l’ordre suivant :

Couche Paramètres Obligatoire
Flux de transactions 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
Codage Texte, Binaire, MTOM, Personnalisé Oui*
Transport TCP, canaux nommés, HTTP, HTTPS, MSMQ, personnalisé Oui

*Étant donné qu’un encodage est requis pour chaque liaison, si un encodage n’est pas spécifié, WCF ajoute un encodage par défaut pour vous. La valeur par défaut est Text/XML pour les transports HTTP et HTTPS, et Binaire dans le cas contraire.

Création d’un élément de liaison

En plus des types dérivés de BindingElement ceux fournis par WCF, vous pouvez créer vos propres éléments de liaison. Cela vous permet de personnaliser le processus de création de la pile de liaisons et les composants qui la composent en créant vos propres types BindingElement qui peuvent être combinés avec les autres types fournis par le système dans la pile.

Par exemple, si vous implémentez un LoggingBindingElement qui permet de consigner le message dans une base de données, vous devez le placer au-dessus d’un canal de transport dans la pile de canaux. Dans ce cas, l'application crée une liaison personnalisée qui compose le LoggingBindingElement avec le 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 l’implémentation d’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 manières. 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 liaison en fonction d’un ensemble arbitraire d’éléments de liaison, y compris les éléments créés par l’utilisateur.

Si vous utilisez la liaison dans plusieurs applications, créez votre propre liaison et étendez la 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. Et il est pré-empaqueté : vous n’avez pas besoin de reconstruire la liaison chaque fois que vous l’utilisez.

Au minimum, une liaison définie par l’utilisateur doit implémenter la CreateBindingElements méthode et la Scheme propriété.

La méthode CreateBindingElements retourne un nouvel BindingElementCollection qui contient les éléments de liaison associés à la connexion. La collection est ordonnée et doit contenir d’abord les éléments de liaison de protocole, suivis de l’élément de liaison d’encodage, suivis de 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 les liaisons personnalisées. Cette collection ne doit jamais référencer des objets mentionnés dans la classe de liaison définie par l’utilisateur ; par conséquent, les auteurs de liaison doivent retourner un Clone() du BindingElementCollection à chaque appel de CreateBindingElements.

La Scheme propriété représente le schéma d’URI du protocole de transport en cours d’utilisation sur la liaison. Par exemple, WSHttpBinding et NetTcpBinding retournent « http » et « net.tcp » à partir de leurs propriétés respectives Scheme .

Pour obtenir la liste complète des méthodes et propriétés facultatives pour les liaisons définies par l’utilisateur, consultez Binding.

Exemple :

Cet exemple implémente la liaison au profil dans SampleProfileUdpBinding, qui dérive de Binding. Le SampleProfileUdpBinding contient jusqu’à quatre éléments de liaison : un UdpTransportBindingElement créé par l'utilisateur; et trois éléments fournis par le système : TextMessageEncodingBindingElement, CompositeDuplexBindingElement, et 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();
}

Restrictions de sécurité avec des contrats Duplex

Tous les éléments de liaison ne sont pas compatibles entre eux. Notamment, il existe des restrictions concernant les éléments de liaison de sécurité en cas d'utilisation avec les contrats duplex.

One-Shot sécurité

Vous pouvez implémenter la sécurité « one-shot », où toutes les informations d’identification de sécurité nécessaires sont envoyées dans un seul message, en définissant l’attribut negotiateServiceCredential de l’élément de configuration du <message> sur false.

L’authentification unique ne fonctionne pas avec les contrats duplex.

Pour les contrats Request-Reply, l’authentification unique fonctionne uniquement si la pile de liaisons sous 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 unidirectionnelle fonctionne si la pile de liaisons sous l’élément de liaison de sécurité prend en charge la création d'instances IRequestChannel, IRequestSessionChannel, IOutputChannel ou IOutputSessionChannel.

Les jetons de contexte de sécurité en mode cookie ne peuvent pas être utilisés avec des contrats duplex.

Pour les contrats Request-Reply, les jetons de contexte de sécurité en mode cookie fonctionnent uniquement si la pile de liaisons située sous 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 mode session SCT fonctionne pour les contrats duplex si la pile de liaisons sous l’élément de liaison de sécurité prend en charge la création des 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 mode session SCT fonctionne pour les contrats unidirectionnels si la pile de liaisons située sous l'élément de liaison de sécurité prend en charge la création d'instances de IDuplexChannel, IDuplexSessionChannel, IRequestChannel ou IRequestSessionChannel.

Dérivation à partir d’une liaison standard

Au lieu de créer une classe de liaison entièrement nouvelle, il peut être possible d’étendre l’une des liaisons fournies par le système existantes. Comme dans le cas précédent, vous devez remplacer la CreateBindingElements méthode et la Scheme propriété.

Voir aussi