Les transports Windows Communication Foundation (WCF) prennent en charge deux modes de transfert dans chaque direction :
Les transferts mis en mémoire tampon conservent la totalité des messages en mémoire tampon tant que leur transfert n'est pas terminé.
Les transferts en continu ne mettent que les en-têtes de message en mémoire tampon et exposent le corps du message sous forme de flux continu, dont des portions peuvent être lues progressivement.
L'affectation au mode de transfert de la valeur Streamed permet d'assurer des communications en flux continu dans les deux sens. En revanche, la valeur StreamedRequest ou StreamedResponse ne permet d'assurer des communications en flux continu que dans le sens spécifié.
Les transferts en flux continu peuvent améliorer l'évolutivité d'un service car ils évitent d'avoir à recourir à de grandes mémoires tampon. Le gain réel d'évolutivité dépend de la taille des messages transférés. Il est plus significatif dans le cas de messages volumineux.
Par défaut, les transports HTTP, TCP/IP et de canal nommé utilisent la mise en mémoire tampon. Vous pouvez donner à TransferMode la valeur des liaisons fournies par le système BasicHttpBinding, NetTcpBinding, NetNamedPipeBinding à l'aide des propriétés du mode de transfert exposées. Le mode peut recevoir la valeur NetTcpBinding, par exemple, à l'aide de la propriété TransferMode. Il peut également être réglé dans la section de configuration pour la liaison.
Pour les liaisons qui n'exposent pas la propriété du mode de transfert, celui-ci peut être défini sur l'élément de liaison de transport, et cet élément peut ensuite être ajouté à une liaison personnalisée. Par exemple, créez HttpTransportBindingElement et utilisez la propriété TransferMode pour définir le mode de transfert lors de la création d'une liaison personnalisée. Le mode de transfert peut également être défini dans la section de configuration pour la liaison personnalisée.
Le choix de l'un ou l'autre mode de transfert (mise en mémoire tampon ou flux continu) revient en local au point de terminaison pour les transports HTTP. Pour les transports HTTP, le mode de transfert ne se propage pas sur une connexion ou sur des serveurs proxy et d'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é un proxy sur un service, vous pouvez (mais ne devez pas) modifier le fichier de configuration des services destinés à être utilisés avec des transferts en continu 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.
Le mode de transfert Streamed provoque l'exécution de WCF pour appliquer certaines restrictions.
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 au niveau de la couche du modèle de programmation. Ce paramètre correspond au corps entier du message et doit être un Message, un sous-type de Stream ou implémenter l'interface IXmlSerializable. Disposer d'une valeur de retour pour une opération équivaut à disposer d'un paramètre de sortie.
Certaines fonctionnalités de WCF, telles que la messagerie fiable 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 la sécurité de niveau transport uniquement ou la sécurité de mode mixte, qui associe des revendications WS-Security à la sécurité de niveau transport.
Les en-têtes SOAP sont toujours mis en mémoire tampon, même lorsque le mode de transfert a la valeur Streamed. Les en-têtes de message ne doivent pas dépasser la taille du quota de transport MaxBufferSize exposé sur les divers éléments de liaison et liaisons.
Modifier le mode de transfert de Buffered en Streamed modifie également la forme du canal natif des transports TCP et des transports de 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. Une conséquence de ce principe réside dans le fait que les contrats de service de session ne composent pas avec la diffusion en flux continu du transport.