Méthodes WCF avec de grands ensembles de résultats - suivi visuel de la progression du transfert

StackOverflow https://stackoverflow.com/questions/1421893

  •  07-07-2019
  •  | 
  •  

Question

J'ai un service WCF qui doit renvoyer des ensembles de données pouvant atteindre 10 Mo ou plus, je souhaite un retour visuel à l'utilisateur, y a-t-il un moyen de suivre l'avancement du téléchargement?

Mon client est Silverlight 3 et, au final, j'aimerais pouvoir lier une barre de progression à ceci; des idées?

EDIT: Après la prime, le SO a automatiquement sélectionné la réponse avec les votes positifs comme la bonne réponse lorsque ce n’est pas le cas.

Était-ce utile?

La solution

Il y a un exemple de cela sur le projet de code, voir:

http://www.codeproject.com/KB/WCF/WCF_FileTransfer_Progress.aspx

Autres conseils

Si vous avez un appel géant de la WCF, vous n’avez que deux états, tout ou rien. De plus, WCF a une taille de transaction maximale. Par conséquent, le renvoi d’un ensemble de données volumineux présente le risque de dépasser cette limite.

Afin de résoudre ces problèmes dans mes projets, j'ai scindé la grande demande en plusieurs demandes plus petites. Je vérifie ensuite le nombre de réponses que j’ai reçues par rapport aux demandes initiales pour obtenir une indication des progrès.

Modifier: ajout d'une meilleure explication.

L'article CodeProject peut être difficile à obtenir. avec Silverlight puisque Silverlight n’a accès qu’à BasicHttpBinding - bien qu’il semble que BasicHttpBinding ait un TransferMode = & "Streamed &"; alors peut-être est-il possible - je ne sais pas.

Si vous pouvez le faire retourner un flux, cela semble être la meilleure approche.

Pourtant, je pensais que je mettrais en avant un & "autre &"; approche.

Peut-être pourriez-vous sérialiser les données dans un fichier et utiliser WebClient pour le télécharger. Donc, en gros, vous avez un WS.GetData () qui enregistre un fichier sur le serveur et renvoie son nom de fichier. L'application Silverlight utiliserait WebClient pour le télécharger (qui contient un événement DownloadProgressChanged).

Je sais que ce n'est pas ce que vous cherchez - juste une idée ...

MODIFIER : j'ai répondu à cette question en pensant que vous vouliez un téléchargeur Silverlight, mais il semblerait en fait que vous souhaitiez un téléchargeur Silverlight. Vous pouvez faire la même chose que j'ai suggéré pour le programme de téléchargement, à l'exception de l'utilisation de HTTP GET, de Binary WCF ou de Sockets.

J'ai écrit un téléchargeur Silverlight 2 avec une barre de progression et je l'ai modelé d'après celui-ci . Il utilise HTTP POST pour envoyer le fichier au serveur pièce par pièce. La difficulté réside dans le fait que plus votre POST est volumineux, plus le fichier sera chargé rapidement, mais votre barre de progression n’est mise à jour qu’une fois par POST. J'ai donc écrit un algorithme qui essaie dynamiquement de trouver la plus grande taille de POST en moins d'une seconde.

Si vous souhaitez utiliser WCF au lieu de HTTP POST, c'est probablement mieux car Silverlight 3 prend désormais en charge le codage de message binaire:

< customBinding >    < binding name = & "MyBinaryBinding &"; maxBufferSize = " 2147483647 "      maxReceivedMessageSize = " 2147483647 " >    < binaryMessageEncoding / >    < httpTransport / >    < / binding > < / customBinding >

OU vous pouvez écrire une implémentation de sockets - Silverlight le prend en charge, mais cela peut être un peu délicat à installer et nécessite que votre serveur ait un port ouvert dans la plage 4502-4532 et le port 943 ouvert pour un fichier de stratégie .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top