2010-06-08 6 views
2

J'essaie de créer un webservice qui permettrait à ses clients de télécharger des fichiers (ce qui peut être de très gros fichiers). Au niveau du serveur, j'ai beaucoup de fichiers qui doivent être renvoyés au consommateur, donc je compresse tous ces fichiers dans un gros fichier zip et les restitue à l'utilisateur. À l'heure actuelle, mon service Web commencera à compresser les fichiers, lorsque la requête entrera, formera les fichiers zip et les retransmettra. La compression peut parfois prendre beaucoup de temps et la requête peut expirer. Que puis-je faire pour éviter de telles situations? Ma solution est maintenant de séparer les données en fichiers zip plus petits, d'envoyer une réponse au consommateur disant qu'il y aurait ces nombreux fichiers plus petits, et de laisser les consommateurs envoyer des demandes pour des fichiers plus petits. Donc, si j'ai un fichier zip de 1 Go, je vais le décomposer en 10 petits fichiers zip, et demander au consommateur de demander des fichiers plus petits dans 10 demandes. Est-ce la bonne approche? Quels problèmes puis-je affronter? Quelqu'un a-t-il déjà géré de tels problèmes? Je serais heureux si vous pouvez partager vos expériences. Aussi, est-il possible de commencer à diffuser les fichiers zip sans les former complètement?Télécharger un fichier volumineux avec un service web C#

Répondre

2

Traite la demande et la livraison comme des opérations asynchrones.

Le client peut effectuer une requête pour le fichier en utilisant une méthode. Une autre méthode peut permettre au client de connaître l'état de l'empaquetage du fichier (s'il est encore prêt à être téléchargé). Une troisième méthode peut effectivement télécharger les fichiers.

+0

Yat-il un exemple que je peux référence? – Debby

0

Il peut être intéressant d'envisager une approche reposante. Plutôt qu'un service web de savon. Comme OrbMan, suggéré une approche asynch peut être le meilleur.

Avec REST, vous pouvez exposer une ressource comme: http://yourlocation/generatefile qui (lorsqu'elle est appelée avec un poste) renvoie une réponse HTTP avec un code de réponse de 301 « accepté » et une valeur d'en-tête de l'emplacement de l'emplacement = http://yourlocation/generatefile/id00124 qui suggère l'emplacement les données.

Vous pouvez ensuite interroger la ressource http://yourlocation/generatefile/id00124 (peut-être simplement la demande d'en-tête) pour obtenir le statut, c'est-à-dire le traitement/l'achèvement.

Lorsque le traitement est terminé. Faites un get sur le http://yourlocation/generatefile/id00124 pour télécharger votre fichier. Le message http de réponse doit identifier votre fichier et le format, c'est-à-dire les types de chiffrement et de compression, afin que tout consommateur sache comment le lire.

Ceci est une bonne solution aux problèmes qui sont longs en cours d'exécution et renvoie des données dans des formats autres que le savon anbd general xml.

J'espère que cette aide

+0

C'est génial. J'ai une question, comment puis-je interroger la ressource pour le statut? Je suis désolé si c'est une question trop bête, mais je viens de commencer à travailler sur C# et Webservices. – Debby

0

je sondage du client appelant dans le cadre de la méthode qui obtient le fichier. Le code client peut couler quelque chose comme ceci:

byte[] GetFile() 
{ 
    response = request.Post(http://yourlocation/generatefile); 
    string dataResource = response.Headers["Location"]; 
    bool resourceReady = false; 
    while(!reasourceReady) 
    { 
    resH = request.Header(dataResource); 
    if(resH.Headers[Status] == "complete") 
     break; 
    else 
     Thread.Sleep(OneSecond); ?? or whetever 
    } 

    fileRes = request.Get(dataResource); 

return fileRes.ToByteArray(); 
} 

Ce n'est psuedo, mais je l'espère, il est logique ...

Questions connexes