Search code examples
silverlightsilverlight-4.0wcf-binding

How to transfer large amount of data using WCF?


We are currently trying to move large amounts of data to a Silverlight 3 client using WCF with PollingDuplex. I have read about the MultiplerMessagesPerPoll in Silverlight 4 and it appears to be quite a bit faster. Are there any examples out there for me to reference (using MultipleMessagesPerPoll)? Or maybe some good references on using Net.TCP? Maybe I should be taking a completely different approach? Any ideas or suggestions would be greatly appreciated.

Thanks!


Solution

  • Streaming serialized response chunks works well:

    Your WCF binding configuration would resemble the following:

    <binding name="myCustomBinding">
       <binaryMessageEncoding />
       <httpTransport transferMode="StreamedResponse" 
                      maxBufferSize="2147483647" 
                      maxBufferPoolSize="2147483647" 
                      maxReceivedMessageSize="2147483647" />
    </binding>
    

    Your Service method would look something like:

    [OperationContract]
    public Stream GetDataStream(string objectId)
    {
       Stream stream = new MemoryStream();
    
       MyObject obj = Manager.GetObject(objectId);
    
       DataContractSerializer serilizer = new DataContractSerializer(typeof(MyObject));
    
       serilizer.WriteObject(stream, obj);
    
       stream.Position = 0;
    
       return stream;
    }
    

    And your client-side completed method would do something like:

    static void client_GetDataStreamCompleted(object sender, GetDataStreamCompletedEventArgs e)
    {
       if (e.Error == null)
       {
          DataContractSerializer serializer = new DataContractSerializer(typeof(MyObject));
    
          MyObject obj = serializer.ReadObject(new MemoryStream(e.Result)) as MyObject;
       }
    }