Subscribe / Unsubscribe Enewsletters | Login | Register

Pencil Banner

Transferring large data over the wire using WCF

Joydip Kanjilal | Aug. 31, 2015
Take advantage of the streamed transfer mode to transfer large amounts of data using WCF

WCF Streaming

WCF (Windows Communication Foundation) is a secure, reliable, and scalable messaging platform for developing services in .Net. It provides support for two modes of transferring data: the buffered mode and the streamed mode. While in the buffered mode (this is the default mode supported by WCF) the data is stored in the buffer in its entirety until the data transfer is complete. In the streamed mode, the data is read in chunks, and the receiver of the message can start processing the message until the transfer is complete.

While the buffered mode is the default and needs the message to be sent to the receiver in its entirety before the message can be processed at the consumer's end, the streamed mode is useful for messages that are large in size. Processing large chunks of data requires a large buffer and a lot of available memory both at the client and also at the server side, hence you need to use streamed mode, which improves the scalability of the service as you don't need to have large memory buffers to hold data.

To enable the any of the modes described above, you need to take advantage of the TransferMode property. This property can have any one of the following values.

  1. Buffered -- enables buffered mode
  2. Streamed -- enables streamed mode of bi-directional communication
  3. StreamedRequest -- enables streamed mode for the request only
  4. StreamedResponse -- enables streamed mode for the response only

Note that the HTTP, TCP/IP, and named pipe transports use buffered transfers by default and the streamed transfer mode needs to be turned on explicitly in the service configuration file. The streamed mode is supported only by the basicHttpBinding, netTcpBinding, and netNamedPipeBinding bindings; the TransferMode is an enum defined in the System.ServiceModel namespace.

using System;

namespace System.ServiceModel

{

    public enum TransferMode

    {

        Buffered = 0,

        Streamed = 1,

        StreamedRequest = 2,

        StreamedResponse = 3,

    }

}

The following code snippet shows how the TransferMode property can be set in the service configuration file.

<system.serviceModel>

  <services>

    <service name="IDG.LargeDataUpload">

      <endpoint address=""

                binding="basicHttpBinding"

                bindingConfiguration=" customStreamedBinding"

                contract="IDG.ILargeDataUpload"/>

    </service>

  </services>

   <bindings>

    <basicHttpBinding>

      <binding name="customStreamedBinding"

                transferMode="Streamed"/>

    </basicHttpBinding>

  </bindings>

</system.serviceModel>

The default message size is 64K (the maximum size it can support is 64MB), but you should increase the message size if you need to use streamed mode and transfer large chunks of data. Here's how you can configure the message size in the service configuration file.

<basicHttpBinding>

<binding name="customStreamedBinding" transferMode="Streamed"

closeTimeout="00:01:00" openTimeout="00:01:00"

receiveTimeout="00:10:00" sendTimeout="00:01:00"

transferMode="Streamed" messageEncoding="Mtom"

maxBufferPoolSize="524288"

maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">

<security mode="None">

<transport clientCredentialType="None"/>

</security>

 

1  2  Next Page 

Sign up for CIO Asia eNewsletters.