7
votes

Obtenez une grande liste de wcf en morceaux?

J'essaie d'obtenir une liste d'entités d'un service de WCF, le problème que je connais est que nous avons une mauvaise latence sur le réseau et que les données prennent donc une durée considérable pour accéder à mon client. L'idée que j'ai est de trouver un moyen d'obtenir le premier 1000 et de pousser ceux-ci à l'interface utilisateur pendant que j'attends que les prochains arrivent.

Je suppose que ce serait comme une pagination mais je veux juste que la page complète dans la couche de WCF plutôt que d'obtenir une page à la fois de la DB

acclamations


0 commentaires

3 Réponses :


3
votes

Vous pouvez toujours diviser votre interface de service en deux méthodes. Par exemple, au lieu de: xxx

Vous pouvez avoir: xxx

de sorte que vous puissiez mettre en œuvre la pagination manuellement.


3 commentaires

Quelle serait la meilleure façon de "cacher" cette liste du côté du service?


Cela dépend de votre couche de persistance. Par exemple, Nhibernate fera la mise en cache automatiquement, tant que vous partagez la session entre les demandes. (En réalité, il a un cache de deux couches et de nombreuses options). Si vous utilisez un autre cadre, vous devez examiner leur documentation. Si vous utilisez directement SQL, cela pourrait être un bon moment pour regarder ceux-ci.


Nous utilisons directement le SQL et la commutation n'est pas une option, je connais déjà la bonté de NHibernate, mais nous avons des contraintes imposées par notre client non pour l'utiliser ...



6
votes

WCF examine le message à son intégralité avant de le remettre à des niveaux plus élevés. Par conséquent, vos données doivent arriver dans des contrats de WCF complets et habituels ne fonctionneront pas.

Cependant, vous pouvez utiliser streaming avec wcf . Cela permet de lire progressivement la charge utile du flux et être transmis aux niveaux plus élevés. Afin de le faire fonctionner, vous devez:

  • Activer le streaming (dans le lien j'ai fourni)
  • Changer le contrat de service pour fournir un flux
  • au serveur final, commencez les entités sérialisées et écrivez au flux, peut-être dans 100 morceaux. Vous devez sérialiser vous-même des entités bien que vous utilisez DatacontractSerializer Notre de la boîte est très simple.
  • Vous devez fournir un délimiteur entre chacune de ces 100 entités afin que votre processus puisse repérer l'endroit où le courant est terminé. Une option possible est de 1 kb d'octet zéro.
  • au côté du client, implémentez la fonction comme ASYNC. Continuez à lire dans le flux de tampons (E.G 4KB) jusqu'à ce que le délimiteur ait frappé le délimiteur. Une fois frappé cela, désérialiser et élever l'événement ASYNC.

    Ce sera plus complexe que wcf tout droit sorti de la boîte mais atteint ce dont vous avez besoin.


4 commentaires

Pas de lien à nouveau. Je viens de vérifier IE 6 (PC de travail) et j'utilise Chrome. J'étais un peu inquiet que c'était le navigateur qui brise quelque chose, mais c'est la même chose dans les deux.


Merci Ian. Je suis en fait mort-malade et au lit afin que cela ait été mon problème :)


Je pense que cela vaut la peine d'essayer, je vais jouer un peu et voir comment ça se passe, idéalement, je veux réaliser quelque chose où cela est résumé et je n'ai pas besoin de vous inquiéter du côté du client de la façon dont cela fonctionne en interne


Si vous implémentez le streaming lorsque vous exposez simplement un flux, le proxy doit savoir. Bien que vous puissiez créer un proxy personnalisé où vous encapsulez toute la désérialisation.



0
votes

À la fin, j'utilise TCPTransport pour ma communication, j'ai fini par utiliser des canaux duplex pour faire ce dont j'avais besoin.

Qu'est-ce que j'ai fait, c'est juste changer ma recherche actuelle qui renvoyait une grande liste à vide. À l'intérieur de cette méthode, je reçois mes données de la base de données, du morceau et de l'envoyer au client via une opération de rappel


0 commentaires