La meilleure façon de déplacer des fichiers de différentes tailles à travers le réseau lent en utilisant .NET

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

Question

Je construis un client .NET Remoting / serveur qui transmet des milliers de fichiers, de différentes tailles (tout de quelques octets à des centaines de Mo), et je voudrais quelques commentaires sur la meilleure méthode pour la réalisation cette. Comme je le vois, il y a deux options:

  • Sérialisez le fichier entier dans mon objet de communication à distance et transmettre du tout à la fois, quelle que soit la taille. Ce serait probablement le plus rapide, mais un échec lors de la transmission exige que l'ensemble du dossier soit réémis, sans aucun moyen de reprendre.
  • Si la taille du fichier est plus grand que quelque chose de petit (comme 4Ko), le casser en morceaux et 4Ko à distance ceux réassemblage sur le serveur. En plus de la complexité de ce fait, il est plus lent à cause des allers-retours continus et accusés de réception, si une défaillance d'une seule pièce ne perd pas beaucoup de temps.
  • Y compris quelque chose comme un serveur FTP ou SFTP avec ma demande - le client informe le serveur qu'il commence à l'aide Remoting, téléchargez le fichier, puis utilisez Remoting pour notifier l'achèvement. Je voudrais tout contenir dans mon application au lieu d'exiger un service FTP séparé, mais je suis ouvert à cette option si elle est nécessaire.
  • Utilisez une sorte de connexion TCP déclaré ou WPF ou une autre méthode de transmission qui est construit pour gérer les pannes ou est capable de faire une sorte de point de contrôle / CV.
  • Toutes les autres que je suis absent?

Quelle est la méthode de transmission la plus flexible / fiable? Je ne suis pas préoccupé par la vitesse, mais plus sur la fiabilité - Je veux que le fichier à déplacer, même si elle est lentement. Étant donné que le client et le serveur sera multi-thread, je peux transmettre plusieurs fichiers en même temps, si la connexion le permet.

Merci pour vos commentaires - Je vais jeter dans une prime pour obtenir des recommandations sur les façons dont les gens accompliraient cette

.
Était-ce utile?

La solution

BITS (arrière-plan de service de transfert intelligent) est une bonne solution. Il a des années d'expérience construite en

Quelques points de départ sont

Autres conseils

Bien que calmh ne répond à la question que vous posez de la couche OSI 4 côté de la vie, je me sens plus comme vous cherchez plus les niveaux d'application dans votre question. TCP fait certainement tout gérer allant de latence, les fenêtres de transmission, etc sur le côté de la mise en réseau de la vie. Cependant, il ne détermine pas directement ce qui se passe si un utilisateur met fin à une session de téléchargement prématurément et décide de les récupérer plus tard où ils l'avaient laissé.

Pour répondre à votre question sous un autre angle, je recommande Chunking le fichier en sections et de les indexer pour toutes les connexions, quelle que soit la vitesse. Ils peuvent ensuite être à nouveau réassemblés sur le client une fois téléchargé le fichier. Cela permet à l'utilisateur de mettre en pause des séances de téléchargement et le reprendre.

En ce qui concerne la détermination de la vitesse, il peut y avoir des méthodes pré-construites pour ce faire, mais une méthode que vous pouvez utiliser est uniquement construire votre propre test de vitesse: Envoyer 1 Mo au client (upload) et l'ont envoyer une réponse une fois reçue. 1100 divisé par le temps qu'il a fallu pour obtenir la réponse de retour du client, est le KB / s il prend le client pour télécharger à partir du serveur. Et vice-versa pour tester le téléchargement du client.

En ce qui concerne la transmission, je recommande l'utilisation des technologies existantes. SFTP soutient authentifié transfert de données cryptées . Il est essentiellement FTP, mais sur SSH. Il devrait y avoir quelque part des API disponibles pour interagir avec cela.

Sur une note côté, je ne l'ai jamais fait quoi que ce soit dans la mesure où vous parlez, mais nous espérons que mes idées au moins vous donner quelques options à considérer.

est ce que TCP lui-même est fait pour, et mis au point pour des décennies ou des tests difficiles. Remoting est fait pour les petits appels RPC, pas les transferts de fichiers. Vous devez simplement utiliser un socket TCP pour transmettre les données, et que les protocoles de couche inférieure inquiètent de temps d'attente, les fenêtres de transmission, MTU, etc.

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