Partage via


Transfert des messages par diffusion en continu

Les transports Windows Communication Foundation (WCF) prennent en charge deux modes de transfert de messages :

  • Les transferts mis en mémoire tampon conservent la totalité des messages en mémoire tampon tant que leur transfert n'est pas terminé. Un message mis en mémoire tampon doit être entièrement remis pour que son destinataire puisse le lire.

  • Les transferts en flux continu exposent les messages sous forme de flux. Le destinataire commence à traiter les messages avant que ceux-ci ne soient complètement remis.

  • Les transferts en flux continu permettent d'améliorer l'évolutivité d'un service car ils évitent d'avoir à recourir à de grandes mémoires tampon. Que le changement de mode de transfert améliore l'évolutivité dépend de la taille des messages transférés. Préférez le transfert en flux continu pour les messages de grande taille.

Par défaut, les transports HTTP, TCP/IP et les transports de canal nommé utilisent les transferts mis en mémoire tampon. Cette rubrique contient des instructions permettant de faire basculer ces transports d'un mode de transfert mis en mémoire tampon à un mode de transfert en flux continu et présente les conséquences d'une telle modification.

Activation des transferts en streaming

La sélection entre les modes de transfert mis en mémoire tampon et en flux continu s’effectue au niveau de l’élément de liaison du transport. La propriété TransferMode de l'élément de liaison peut avoir la valeur Buffered, Streamed, StreamedRequest ou StreamedResponse. L'affectation de Streamed au mode de transfert permet d'assurer la communication en mode de diffusion en continu dans les deux sens. L'affectation au mode de transfert de la valeur StreamedRequest ou StreamedResponse permet d'assurer des communications en flux continu dans le sens spécifié uniquement.

Les liaisons BasicHttpBinding, NetTcpBinding et NetNamedPipeBinding exposent la propriété TransferMode. Pour les autres transports, vous devez créer une liaison personnalisée pour pouvoir définir le mode de transfert.

La décision d'utiliser des transferts mis en mémoire tampon ou diffusés en continu est une décision locale du point de terminaison. Pour les transports HTTP, le mode de transfert n'est pas propagé à la totalité de la connexion ni aux serveurs ni autres intermédiaires. La description de l'interface de service ne reflète pas le mode de transfert défini. Après avoir généré une classe client pour un service, vous devez modifier le fichier de configuration des services destinés à être utilisés avec des transferts en flux continus pour définir le mode. Pour les transports TCP et les transports de canal nommé, le mode de transfert est propagé sous forme d'assertion de stratégie.

Pour obtenir des exemples de code, consultez Guide pratique pour activer la diffusion en continu.

Activation de la diffusion en continu asynchrone

Pour activer la diffusion en continu asynchrone, ajoutez le comportement de point de terminaison DispatcherSynchronizationBehavior à l’hôte de service et affectez à sa propriété AsynchronousSendEnabled la valeur true.

Cette version de WCF a également ajouté la fonctionnalité de streaming réellement asynchrone côté envoi. Cela améliore l'extensibilité du service dans les scénarios où des messages sont diffusés en continu à plusieurs clients, dont certains sont lents dans la lecture ; probablement en raison de la congestion du réseau ou ne lisent pas du tout. Dans ces scénarios, WCF ne bloque plus les threads individuels sur le service par client. Cela garantit que le service peut gérer beaucoup plus de clients, améliorant ainsi la scalabilité du service.

Restrictions relatives aux transferts en flux continu

L’utilisation du mode de transfert en continu entraîne l’application de restrictions supplémentaires au runtime.

Le contrat des opérations intervenant sur un transport en flux continu peut contenir au maximum un paramètre d'entrée ou de sortie. Ce paramètre incarne l'intégralité du corps des messages et doit être un Message, un type dérivé de Stream ou une implémentation de IXmlSerializable. Disposer d'une valeur de retour pour une opération équivaut à disposer d'un paramètre de sortie.

Certaines fonctionnalités WCF, telles que la messagerie fiable, les transactions et la sécurité de niveau message SOAP s’appuient sur les messages en mémoire tampon pour leurs transmissions. L’utilisation de ces fonctionnalités peut réduire, voire annuler les gains en termes de performances obtenus grâce au flux continu. Pour sécuriser un transport en flux continu, utilisez uniquement la sécurité au niveau du transport ou la sécurité au niveau du transport plus uniquement la sécurité de niveau message avec authentification.

Les en-têtes SOAP sont toujours mis en mémoire tampon, même lorsque le mode de transfert a la valeur flux continu. La taille des en-têtes de message ne doit pas dépasser la taille du quota de transport MaxBufferSize. Pour plus d’informations sur ce paramètre, consultez Quotas de transport.

Différences entre les transferts mis en mémoire tampon et les transferts en flux continu

Modifier le mode de transfert de « mis en mémoire tampon » à « en flux » modifie également la forme du canal natif des transports TCP et des transports par canal nommé. Pour les transferts mis en mémoire tampon, la forme du canal natif est IDuplexSessionChannel. Pour les transferts en flux continu, les canaux natifs correspondent à IRequestChannel et à IReplyChannel. Modifier le mode de transfert d'une application existante utilisant directement ces transports (c'est-à-dire sans passer par un contrat de service) implique de modifier la configuration de canal prévue pour les fabriques et auditeurs de canal.

Voir aussi