Client and Service exchange message using Streaming transfer mode, receiver can start processing the message before it is completely delivered. Streamed transfers can improve the scalability of a service by eliminating the requirement for large memory buffers. If you want to transfer large message, streaming is the best method.
There are some restriction, when streaming is enabled in WCF
- Digital signatures for the message body cannot be performed
- Encryption depends on digital signatures to verify that the data has been reconstructed correctly.
- Reliable sessions must buffer sent messages on the client for redelivery if a message gets lost in transfer and must hold messages on the service before handing them to the service implementation to preserve message order in case messages are received out-of-sequence.
- Streaming is not available with the Message Queuing (MSMQ) transport
- Streaming is also not available when using the Peer Channel transport
WCF uses .Net stream class for Streaming the message. Stream in base class for streaming, all subclasses like FileStream,MemoryStream, NetworkStream are derived from it. Stream the data, you need to do is, to return or receive a Stream as an operation parameter.
public interface IMyService
void SaveStreamData(Stream emp);
- Stream and it's subclass can be used for streaming, but it should be serializable
- Stream and MemoryStream are serializable and it will support streaming
- FileStream is non serializable, and it will not support streaming
Streaming and Binding
Only the TCP, IPC, and basic HTTP bindings support streaming. With all of these bindings streaming is disabled by default. TransferMode property should be set according to the desired streaming mode in the bindings.
public enum TransferMode
public class BasicHttpBinding : Binding,...
public TransferMode TransferMode
- StreamedRequest - Send and accept requests in streaming mode, and accept and return responses in buffered mode
- StreamResponse - Send and accept requests in buffered mode, and accept and return responses in streamed mode
- Streamed - Send and receive requests and responses in streamed mode in both directions
- Buffered -Send and receive requests and responses in Buffered mode in both directions
Streaming and Transport
The main aim of the Streaming transfer mode is to transfer large size data, but default message size is 64K. So you can increase the message size using maxReceivedMessageSize attribute in the binding element as shown below.
- Always create the service with Interface->Implementation format, mention the contract in Interface.
- Define the service in Class library and refer the class library in Host project. Don’t use service class in host project.
- Change the instance mode to per call as default.
- Always catch exception using try/catch block and throw exception using FaultException < T >.
- Logging and Include exception should be enable while compiling the project in debug mode. While in production deployment disable the logging and Include exception details.