2010-07-21 12 views
3

J'ai un service WCF qui renvoie un tableau d'octets avec un fichier Zip (50 Mo) à tout client qui le demande. Si le Zip est très petit (disons 1 Mo), la réponse SOAP vient de WCF avec le tableau d'octets intégré. Mais la taille de la réponse est très grande, même pour un fichier de 1 Mo. Si j'essaie de transférer le fichier de 50 Mo, le service se bloque et génère une exception de mémoire insuffisante, car la taille de la réponse SOAP est énorme.Comment transférer un gros fichier Zip (50 Mo) en utilisant un service WCF via SOAP à un client?

  1. Quelle est la meilleure option disponible avec le service WCF/Web pour transférer de gros fichiers (principalement au format ZIP) que je RENVOYER un tableau d'octets. Y at-il une bonne approche au lieu de cela pour renvoyer le fichier? Le service WCF/Web est-il le meilleur moyen de transférer des fichiers volumineux vers un client ou existe-t-il une autre option/technologie de meilleure qualité permettant d'atteindre l'interopérabilité et l'évolutivité pour 10 000 utilisateurs?

Mon CCODE est ci-dessous:

 String pathfordownload = @"D:\New Folder.zip"; 
     FileStream F2D = new FileStream(pathfordownload, FileMode.Open,FileAccess.Read); 
     BinaryReader binReader = new BinaryReader(F2D); 
     binReader.BaseStream.Position = 0; 
     byte[] binFile = binReader.ReadBytes(Convert.ToInt32 (binReader.BaseStream.Length)); 
     binReader.Close(); 
     return binFile; 

Un morceau/véritable morceau de travail d'information sera vraiment utile que je me bats avec toutes les données disponibles dans Google et ont eu pas de bons résultats pour la dernière la semaine.

Répondre

4

Vous pouvez transférer un Stream through WCF et vous pouvez envoyer (presque) les fichiers de longueur illimitée.

2

J'ai fait face à exactement le même problème. La mémoire insuffisante est inévitable car vous utilisez des tableaux Byte.

Ce que nous avons fait est de vider les données sur le disque dur, donc au lieu d'être limité par votre mémoire virtuelle de votre capacité pour les transactions simultanées est l'espace HD.

Ensuite, pour le transfert, nous Jut placé le fichier sur l'autre ordinateur. Bien sûr, dans notre cas, il s'agissait d'un transfert de fichiers serveur à serveur. Si vous voulez découpler le peer, vous pouvez utiliser un téléchargement de fichier dans http.

Ainsi, au lieu de répondre avec un fichier, votre service pourrait répondre par une URL http à l'emplacement du fichier. Ensuite, lorsque le client a téléchargé avec succès le serveur avec un HttpRequest standard ou WebClient, il appelle une méthode pour supprimer le fichier. Dans SOAP, qui pourrait être Delete (string url), dans REST, ce serait la méthode delete sur la ressource.

J'espère que cela fait sens pour vous. La partie la plus importante de ceci est de comprendre que dans un logiciel évolutif, surtout si vous regardez 10000 clients (concurrents?), Vous ne pouvez pas utiliser des ressources limitées, comme des flux de mémoire ou des tableaux d'octets. Mais comptez plutôt sur de grandes ressources facilement extensible comme une partition de disque dur qui pourrait éventuellement être sur un SAN et IT pourrait développer la partition au besoin.

+0

J'ai essayé avec RESTFul WCF Services et son fonctionnement bien. – Defendore