Mises à niveau de flux personnalisées

Les transports orientés flux, tels que TCP et Canaux nommés, fonctionnent sur un flux continu d'octets entre le client et le serveur. Ce flux est accompli par un objet Stream. Dans une mise à niveau de flux, le client souhaite ajouter une couche de protocole facultative à la pile de canaux et demande à l'autre extrémité du canal de communication de le faire. La mise à niveau de flux consiste à remplacer l'objet Stream d'origine par une version mise à niveau.

Par exemple, vous pouvez générer un flux de compression directement sur le flux de transport. Dans ce cas, le Stream de transport d'origine est remplacé par un flux qui encapsule le Stream de compression autour du flux d'origine.

Vous pouvez appliquer plusieurs mises à niveau de flux, chacune encapsulant la précédente.

Fonctionnement des mises à niveau de flux

Le processus de mise à niveau de flux comporte quatre composants.

  1. Un initiateur de flux de mise à niveau commence le processus : au moment de l’exécution, il peut lancer une demande adressée à l’autre extrémité de sa connexion pour mettre à niveau la couche de transport de canal.

  2. Un accepteur de flux de mise à niveau exécute la mise à niveau : au moment de l’exécution, il reçoit la demande de mise à niveau provenant de l’autre machine et, dans la mesure du possible, il accepte la mise à niveau.

  3. Un fournisseur de mises à niveau crée l’initiateur sur le client et l’accepteur sur le serveur.

  4. Un élément de liaison de mise à niveau de flux est ajouté aux liaisons sur le service et le client, et crée le fournisseur au moment de l’exécution.

Notez que dans le cas de plusieurs mises à niveau, l'initiateur et l'accepteur encapsulent des ordinateurs d'état pour appliquer les transitions de mise à niveau valides pour chaque initiation.

Comment implémenter une mise à niveau de flux

Windows Communication Foundation (WCF) fournit quatre classes abstract que vous pouvez implémenter :

Pour implémenter une mise à niveau de flux personnalisée, procédez comme suit. Cette procédure implémente un processus de mise à niveau de flux minimal sur les ordinateurs client et serveur.

  1. Créez une classe qui implémente StreamUpgradeInitiator.

    1. Substituez la méthode InitiateUpgrade à appliquer au flux à mettre à niveau et retournez le flux mis à niveau. Cette méthode fonctionne de façon synchrone ; il existe des méthodes analogues pour initier la mise à niveau de façon asynchrone.

    2. Substituez la méthode GetNextUpgrade pour rechercher des mises à niveau supplémentaires.

  2. Créez une classe qui implémente StreamUpgradeAcceptor.

    1. Substituez la méthode AcceptUpgrade à appliquer au flux à mettre à niveau et retournez le flux mis à niveau. Cette méthode fonctionne de façon synchrone ; il existe des méthodes analogues pour accepter la mise à niveau de façon asynchrone.

    2. Substituez la méthode CanUpgrade pour déterminer si la mise à niveau demandée est prise en charge, à ce stade, par cet accepteur de mise à niveau, lors du processus de mise à niveau.

  3. Créez une classe qui implémente StreamUpgradeProvider. Substituez les méthodes CreateUpgradeAcceptor et CreateUpgradeInitiator pour retourner des instances de l'accepteur et de l'initiateur définies aux étapes 2 et 1.

  4. Créez une classe qui implémente StreamUpgradeBindingElement.

    1. Substituez la méthode BuildClientStreamUpgradeProvider sur le client et la méthode BuildServerStreamUpgradeProvider sur le service.

    2. Substituez la méthode BuildChannelFactory sur le client et la méthode BuildChannelListener sur le service pour ajouter l'élément de liaison de mise à niveau à BindingParameters.

  5. Ajoutez le nouvel élément de liaison de mise à niveau de flux aux liaisons sur les ordinateurs serveur et client.

Mises à niveau de sécurité

L'ajout d'une mise à niveau de sécurité est une version spécialisée du processus de mise à niveau de flux général.

WCF fournit déjà deux éléments de liaison pour mettre à niveau la sécurité des flux. La configuration de sécurité au niveau du transport est encapsulée par WindowsStreamSecurityBindingElement et SslStreamSecurityBindingElement qui peuvent être configurés et ajoutés à une liaison personnalisée. Ces éléments de liaison étendent la classe StreamUpgradeBindingElement qui génère les fournisseurs de mise à niveau de flux client et serveur. Ces éléments de liaison ont des méthodes qui créent les classes de fournisseur de mise à niveau de flux de sécurité spécialisées, qui ne sont pas public ; par conséquent, dans ces deux cas, il vous suffit d’ajouter l’élément de liaison à la liaison.

Pour les scénarios de sécurité incompatibles avec les deux éléments de liaison précités, trois classes abstract relatives à la sécurité sont dérivées des classes de base d’initiateur, d’accepteur et de fournisseur précitées :

  1. System.ServiceModel.Channels.StreamSecurityUpgradeInitiator

  2. System.ServiceModel.Channels.StreamSecurityUpgradeAcceptor

  3. System.ServiceModel.Channels.StreamSecurityUpgradeProvider

Le processus d'implémentation d'une mise à niveau de flux de sécurité est le même que précédemment, à ceci près que vous dérivez les données de ces trois classes. Substituez les propriétés supplémentaires dans ces classes pour fournir des informations de sécurité au runtime.

Mises à niveau multiples

Pour créer des demandes de mise à niveau supplémentaires répétez le processus précité : créez des extensions supplémentaires du StreamUpgradeProvider et des éléments de liaison. Ajoutez les éléments de liaison à la liaison. Les éléments de liaison supplémentaires sont traités de manière séquentielle, en commençant par le premier élément de liaison ajouté à la liaison. Dans BuildChannelFactory et BuildChannelListener chaque fournisseur de mise à niveau peut déterminer comment venir s'ajouter à tout paramètre de liaison de mise à niveau préexistant. Il doit ensuite remplacer le paramètre de liaison de mise à niveau existant par un nouveau paramètre de liaison de mise à niveau composite.

Un fournisseur de mise à niveau peut également prendre en charge plusieurs mises à niveau. Par exemple, vous pouvez souhaiter implémenter un fournisseur de mise à niveau de flux personnalisé qui prend en charge à la fois la sécurité et la compression. Procédez comme suit :

  1. Sous-classez StreamSecurityUpgradeProvider pour écrire la classe de fournisseur qui crée l'initiateur et l'accepteur.

  2. Sous-classez StreamSecurityUpgradeInitiator en veillant à substituer la méthode GetNextUpgrade pour retourner les types de contenu pour le flux de compression et le flux sécurisé dans l'ordre.

  3. Sous-classez StreamSecurityUpgradeAcceptor qui reconnaît les types de contenu personnalisés dans sa méthode CanUpgrade.

  4. Le flux sera mis à niveau après chaque appel à GetNextUpgrade et CanUpgrade.

Voir aussi