2010-05-03 3 views
4

В настоящее время мы пытаемся переместить большие объемы данных клиенту Silverlight 3 с использованием WCF с помощью PollingDuplex. Я читал о MultiplerMessagesPerPoll в Silverlight 4, и, похоже, он немного быстрее. Есть ли какие-нибудь примеры для меня, чтобы ссылаться (используя MultipleMessagesPerPoll)? Или, может быть, хорошие ссылки на использование Net.TCP? Может быть, я должен придерживаться совершенно другого подхода? Будем очень благодарны за любые идеи или предложения.Как передать большой объем данных с помощью WCF?

Спасибо!

ответ

2

Streaming ломти сериализованная ответ хорошо работает:

Ваш WCF конфигурации привязки будет выглядеть следующим образом:

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

Ваш метод обслуживания будет выглядеть примерно так:

[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; 
} 

И ваша клиентская сторона завершенный метод сделал бы что-то вроде:

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; 
    } 
} 
1

Я реализовал предлагаемое решение выше. После реализации, я нашел эту ссылку:

http://msdn.microsoft.com/en-us/library/ms752244.aspx

Затем я реализовал бинарный писатель, как показано ниже.

Сервис Метод:

[OperationContract] 
    public Stream GetAllLocationsDataStream(string customerId) 
    { 
     Stream stream = new MemoryStream(); 
     try 
     { 
      Customer customer = ServiceEquipmentManager.GetCustomerAllLocations(customerId); 
      DataContractSerializer serializer = new DataContractSerializer(typeof(Customer)); 
      XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream); 
      serializer.WriteObject(binaryDictionaryWriter, customer); 
      binaryDictionaryWriter.Flush(); 
     } 
     catch (Exception ex) 
     { 
      string timestamp; 
      ExceptionHelper.HandleExceptionWrapper(ex, "Log Only", out timestamp); 
     } 

     stream.Position = 0; 
     return stream; 
    } 

стороне клиента Завершено событие:

XmlDictionaryReader binaryDictionaryReader = XmlDictionaryReader.CreateBinaryReader(new MemoryStream(e.Argument as byte[]), XmlDictionaryReaderQuotas.Max); 

     Customer customer = serializer.ReadObject(binaryDictionaryReader) as Customer; 

Я проверил разницу моего объекта, как показано в приведенной выше ссылке, мои результаты приведены ниже:


Текст = 68,866,216 байт


Бинарные = 49,207,475 байт (28,5% меньше, чем текст)

+1

Спасибо, это решение сработало для меня! Просто и очень быстро! Я едва мог загрузить ~ 300 предметов раньше, и теперь я загружаю ~ 4000 предметов! За меньшее время! –

0

Я основывая это на ваш ответ и его акцент на размер данных, которые вы передающим. Если вы сохраняете блоки данных, переданные под 4 ГБ, вы можете использовать GZipStream class в пространстве имен System.IO.Compression. По моему опыту использования его простым текстом он уменьшил поток данных примерно до 17-20% от его первоначального размера.

+0

Спасибо Остин! Я обязательно посмотрю на это! – JSprang

Смежные вопросы