2010-05-03 6 views
4

Nous essayons actuellement de déplacer de grandes quantités de données vers un client Silverlight 3 en utilisant WCF avec PollingDuplex. J'ai lu sur le MultiplerMessagesPerPoll dans Silverlight 4 et il semble être un peu plus rapide. Y at-il des exemples pour moi de référence (en utilisant MultipleMessagesPerPoll)? Ou peut-être quelques bonnes références sur l'utilisation de Net.TCP? Peut-être que je devrais adopter une approche complètement différente? Toute idée ou suggestion serait grandement appréciée.Comment transférer une grande quantité de données en utilisant WCF?

Merci!

Répondre

2

en streaming morceaux de réponse sérialisé fonctionne bien:

Votre configuration de liaison WCF ressemblerait à ce qui suit:

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

Votre méthode de service ressemblerait à quelque chose comme:

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

Et votre côté client méthode achevée ferait quelque chose comme:

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

J'ai mis en œuvre la solution suggérée ci-dessus. Après la mise en œuvre, j'ai trouvé ce lien:

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

Je puis mis en œuvre l'écrivain binaire, comme indiqué ci-dessous.

service Méthode:

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

côté client Terminé l'événement:

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

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

J'ai vérifié la différence de mon objet, comme indiqué dans le lien ci-dessus, mes résultats sont présentés ci-dessous:


Texte = 68,866,216 octets


binaires = 49,207,475 octets (28,5%) moins de texte

+1

Merci, cette solution a fonctionné pour moi! Simple et très rapide! J'étais à peine capable de charger ~ 300 articles avant, et maintenant je charge ~ 4000 articles! En moins de temps !! –

0

Je fonde cela sur votre réponse et l'accent mis sur la taille des données que vous transférez. Si vous conservez les blocs de données transférés sous 4 Go, vous pouvez utiliser le GZipStream class dans l'espace de noms System.IO.Compression. Dans mon expérience en l'utilisant avec du texte brut, il a réduit le flux de données à environ 17-20% de sa taille d'origine.

+0

Merci Austin! Je vais certainement jeter un coup d'oeil à ceci! – JSprang

Questions connexes