Nachrichtenübertragung per StreamStreaming Message Transfer

Windows Communication Foundation (WCF)--Transporte unterstützen zwei Modi zum Übertragen von Nachrichten:Windows Communication Foundation (WCF) transports support two modes for transferring messages:

  • Bei gepufferten Übertragungen wird die gesamte Nachricht in einem Puffer zwischengespeichert, bis die Übertragung abgeschlossen ist.Buffered transfers hold the entire message in a memory buffer until the transfer is complete. Gepufferte Nachrichten müssen vollständig übertragen worden sein, bevor sie vom Empfänger gelesen werden können.A buffered message must be completely delivered before a receiver can read it.

  • Bei Streamingübertragungen wird die Nachricht als Stream verfügbar gemacht.Streamed transfers expose the message as a stream. Die Nachricht kann vom Empfänger verarbeitet werden, bevor sie vollständig empfangen wurde.The receiver starts processing the message before it is completely delivered.

  • Streamübertragungen können die Skalierbarkeit eines Diensts verbessern, indem sie große Speicherpuffer überflüssig machen.Streamed transfers can improve the scalability of a service by eliminating the requirement for large memory buffers. Der Einfluss einer Änderung des Übertragungsmodus auf die Skalierbarkeit ist abhängig von der Größe der übertragenen Nachricht.Whether changing the transfer mode improves scalability depends on the size of the messages being transferred. Je größer eine Nachricht ist, desto eher ist eine Streamübertragung zu bevorzugen.Large message sizes favor using streamed transfers.

HTTP, TCP/IP sowie Named Pipe-Transporte verwenden gepufferte Übertragungen.By default, the HTTP, TCP/IP, and named pipe transports use buffered transfers. In diesem Dokument wird beschrieben, wie Streamingübertragungen anstelle von gepufferten Übertragungen für diese Transporte verwendet werden, und welche Konsequenzen sich daraus ergeben.This document describes how to switch these transports from a buffered to streamed transfer mode and the consequences of doing so.

Aktivieren von StreamübertragungenEnabling Streamed Transfers

Die Auswahl zwischen der gepufferten Übertragung und der Streamingübertragung erfolgt mithilfe des Transportbindungselements.Selecting between buffered and streamed transfer modes is done on the binding element of the transport. Das Bindungselement weist eine TransferMode-Eigenschaft auf, die auf Buffered, Streamed, StreamedRequest oder StreamedResponse festgelegt werden kann.The binding element has a TransferMode property that can be set to Buffered, Streamed, StreamedRequest, or StreamedResponse. Wenn Sie den Übertragungsmodus auf Streamed festlegen, wird ein Kommunikationsstream in beide Richtungen ermöglicht.Setting the transfer mode to Streamed enables streaming communication in both directions. Wenn Sie den Übertragungsmodus auf StreamedRequest oder StreamedResponse festlegen, wird ein Kommunikationsstream nur in der angegebenen Richtung ermöglicht.Setting the transfer mode to StreamedRequest or StreamedResponse enables streaming communication in the indicated direction only.

Mit den Bindungen BasicHttpBinding, NetTcpBinding und NetNamedPipeBinding wird die TransferMode-Eigenschaft verfügbar gemacht.The BasicHttpBinding, NetTcpBinding, and NetNamedPipeBinding bindings expose the TransferMode property. Für andere Transporte müssen Sie eine benutzerdefinierte Bindung erstellen, um den Übertragungsmodus festzulegen.For other transports, you must create a custom binding to set the transfer mode.

Die Entscheidung über die Verwendung der gepufferten oder der Streamingübertragung wird lokal am Endpunkt getroffen.The decision to use either buffered or streamed transfers is a local decision of the endpoint. Bei HTTP-Übertragungen wird der Übertragungsmodus nicht über Verbindungen oder an Server oder andere Vermittler weitergegeben.For HTTP transports, the transfer mode does not propagate across a connection, or to servers and other intermediaries. Das Festlegen des Übertragungsmodus spiegelt sich nicht in der Beschreibung der Dienstschnittstelle wider.Setting the transfer mode is not reflected in the description of the service interface. Nachdem Sie eine Clientklasse für einen Dienst erstellt haben, müssen Sie die Konfigurationsdatei für Dienste bearbeiten, die mit Streamingübertragungen verwendet werden sollen, um den Modus festzulegen.After generating a client class for a service, you must edit the configuration file for services intended to be used with streamed transfers to set the mode. Bei TCP und Named Pipe-Transporten wird der Übertragungsmodus als Richtlinienassertion weitergegeben.For TCP and named pipe transports, the transfer mode is propagated as a policy assertion.

Codebeispiele finden Sie unter Vorgehensweise: Aktivieren von Streaming.For code samples, see How to: Enable Streaming.

Aktivieren von asynchronem StreamingEnabling Asynchronous Streaming

Um das asynchrone Streaming zu aktivieren, fügen Sie dem Diensthost das DispatcherSynchronizationBehavior-Endpunktverhalten hinzu und legen dessen AsynchronousSendEnabled-Eigenschaft auf true fest.To enable asynchronous streaming, add the DispatcherSynchronizationBehavior endpoint behavior to the service host and set its AsynchronousSendEnabled property to true.

Mit dieser WCF-Version wird die Fähigkeit zum echten asynchronen Streaming auf der Senderseite hinzugefügt.This version of WCF also adde the capability of true asynchronous streaming on the send side. Dies verbessert die Skalierbarkeit des Diensts in Szenarien, in denen Nachrichten an mehrere Clients gestreamt werden, von denen einige eine langsame Lesegeschwindigkeit haben, möglicherweise aufgrund von Netzwerküberlastung, oder überhaupt nicht lesen.This improves scalability of the service in scenarios where it is streaming messages to multiple clients some of which are slow in reading; possibly due to network congestion or are not reading at all. In diesen Szenarien werden einzelne Threads für den Dienst pro Client nicht blockiert.In these scenarios WCF no longer blocks individual threads on the service per client. Dadurch wird sichergestellt, dass der Dienst in der Lage ist, viel mehr Clients zu verarbeiten und somit die Skalierbarkeit des Diensts zu verbessern.This ensures that the service is able to process many more clients thereby improving the scalability of the service.

Einschränkungen für StreamübertragungenRestrictions on Streamed Transfers

Wenn Sie den Streamübertragungsmodus verwenden, werden zusätzliche Einschränkungen von der Laufzeit implementiert.Using the streamed transfer mode causes the run time to enforce additional restrictions.

Vorgänge, die unter Verwendung einer Streamübertragung ausgeführt werden, können einen Vertrag mit maximal einem Eingabe- oder Ausgabeparameter aufweisen.Operations that occur across a streamed transport can have a contract with at most one input or output parameter. Der Parameter entspricht dem gesamten Nachrichtentext, und es muss sich um Message, um einen abgeleiteten Typ von Stream oder um eine IXmlSerializable-Implementierung handeln.That parameter corresponds to the entire body of the message and must be a Message, a derived type of Stream, or an IXmlSerializable implementation. Ein Rückgabewert für einen Vorgang entspricht einem Ausgabeparameter.Having a return value for an operation is equivalent to having an output parameter.

Einige WCF-Funktionen, z. B. zuverlässigem messaging, Transaktionen und SOAP-nachrichtensicherheit, verwenden gepufferte Nachrichten für Übertragungen.Some WCF features, such as reliable messaging, transactions, and SOAP message-level security, rely on buffering messages for transmissions. Dadurch können mögliche Leistungsvorteile durch das Streaming reduziert oder zunichte gemacht werden.Using these features may reduce or eliminate the performance benefits gained by using streaming. Mit der Sicherheit auf Transportebene oder mit der Sicherheit auf Transportebene sowie dem Authentifizierungsmodus für die Nachrichtensicherheit können Sie eine Streamübertragung absichern.To secure a streamed transport, use transport-level security only or use transport-level security plus authentication-only message security.

SOAP-Header werden immer gepuffert, auch wenn eine Streamübertragung verwendet wird.SOAP headers are always buffered, even when the transfer mode is set to streamed. Die Nachrichtenheader dürfen nicht größer sein als das MaxBufferSize-Transportkontingent.The headers for a message must not exceed the size of the MaxBufferSize transport quota. Weitere Informationen zu dieser Einstellung finden Sie unter Transportkontingente.For more information about this setting, see Transport Quotas.

Unterschiede zwischen gepufferten und StreamingübertragungenDifferences Between Buffered and Streamed Transfers

Durch das Ändern des Übertragungsmodus von gepuffert in gestreamt wird auch die systemeigene Kanalform von TCP- und Named Pipe-Transporten geändert.Changing the transfer mode from buffered to streamed also changes the native channel shape of the TCP and named pipe transports. Die systemeigene Kanalform für gepufferte Übertragungen ist IDuplexSessionChannel.For buffered transfers, the native channel shape is IDuplexSessionChannel. Die systemeigenen Kanäle für Streamingübertragungen sind IRequestChannel und IReplyChannel.For streamed transfers, the native channels are IRequestChannel and IReplyChannel. Wenn Sie den Übertragungsmodus in einer bestehenden Anwendung ändern möchten, die diese Transporte unmittelbar (d. h. nicht über einen Dienstvertrag) verwendet, müssen Sie die erwartete Kanalform für Kanalfactorys und -listener ändern.Changing the transfer mode in an existing application that uses these transports directly (that is, not through a service contract) requires changing the expected channel shape for channel factories and listeners.

Siehe auchSee Also

Vorgehensweise: Aktivieren von StreamingHow to: Enable Streaming