5

Buduję klienta/serwer zdalnego .NET, który będzie przesyłać tysiące plików o różnych rozmiarach (od kilku bajtów do setek MB) , i chciałbym uzyskać informację zwrotną na temat najlepszej metody osiągnięcia tego. Jak ja to widzę, istnieje kilka opcji:Najlepszy sposób przenoszenia plików o różnych rozmiarach w powolnej sieci przy użyciu .NET

  • Serializować cały plik do mojego obiektu remoting i przekazuje na wszystkie na raz, niezależnie od ich wielkości. Prawdopodobnie byłaby to najszybsza, ale awaria podczas transmisji wymaga, aby cały plik został ponownie przesłany, bez możliwości wznowienia.
  • Jeśli rozmiar pliku jest większy niż coś małego (np. 4KB), podziel go na porcje 4KB i zdalne, ponownie zmontuj na serwerze. Oprócz złożoności tego zjawiska, jest on wolniejszy z powodu ciągłych podróży w obie strony i potwierdzeń, chociaż awaria jednego elementu nie marnuje zbyt wiele czasu.
  • W tym coś podobnego do serwera FTP lub SFTP z moją aplikacją - klient powiadomi serwer, że zaczyna używać zdalnego połączenia, przesłać plik, a następnie użyj zdalnego przekazywania do powiadomienia o zakończeniu. Chciałbym zawrzeć wszystko w mojej aplikacji zamiast wymagać oddzielnej usługi FTP, ale jestem otwarty na tę opcję, jeśli jest potrzebna.
  • Użyj pewnego rodzaju podanego połączenia TCP lub WPF lub innej metody transmisji, która jest zbudowana do obsługi awarii lub jest w stanie wykonać jakiś punkt kontrolny/wznowić.
  • Brakuje mi jakichś innych?

Jaka jest najbardziej elastyczna/niezawodna metoda transmisji? Nie martwię się o szybkość, ale bardziej o niezawodność - chcę, żeby plik się poruszał, nawet jeśli jest wolny. Ponieważ klient i serwer będą wielowątkowe, mogę przesyłać wiele plików w tym samym czasie, jeśli pozwala na to połączenie.

Dziękuję za opinię - wrzucę nagrodę, aby uzyskać rekomendacje dotyczące sposobów, w jakie ludzie mogliby to osiągnąć.

Odpowiedz

4

Usługa BITS (usługa inteligentnego transferu w tle) jest dobrym rozwiązaniem. Posiada wieloletnie doświadczenie zbudowane w

Niektóre punkty wyjściowe są

+1

Nie brałem pod uwagę usługi BITS, ale wydaje mi się, że dokładnie taką funkcję próbuję replikować - nie ma sensu pisanie jej, gdy już istnieje. Czy wiesz, czy istnieje sposób na przesłanie pliku bez usług IIS? Moje wstępne (i niekompletne) badania wydają się mówić, że wymaga to usług IIS - a nie ogranicznika, ale nie miałem żadnych zewnętrznych zależności. – SqlRyan

0

To jest to, do czego służy sam TCP i dostrajany przez dziesięciolecia lub trudne testy. Remoting jest wykonywany dla małych wywołań RPC, a nie dużych transferów plików. Powinieneś po prostu użyć gniazda TCP do transmisji danych i pozwolić protokołom niższej warstwy martwić się opóźnieniami, oknami transmisji, MTU itd.

+0

robi podaną połączenie TCP (lub zarządzającego całą kolekcję z nich z serwera) wydaje się ogromny ból, a tha Tego właśnie próbowałem uniknąć. – SqlRyan

1

Chociaż calmh odpowiada na pytanie, które zadasz z warstwy 4 OSI życie, czuję, że bardziej przypominasz poziomy aplikacji w swoim pytaniu. TCP zdecydowanie radzi sobie ze wszystkim, począwszy od opóźnień, okien transmisji, itp. Po stronie sieciowej życia. Nie określa jednak bezpośrednio, co się stanie, jeśli użytkownik przedwcześnie zakończy sesję pobierania, a następnie zdecyduje się ją odebrać w późniejszym terminie.

Aby odpowiedzieć na twoje pytanie z innej strony, zdecydowanie polecam dzielenie pliku na sekcje i indeksowanie ich dla wszystkich połączeń, niezależnie od prędkości. Następnie mogą zostać ponownie złożone na kliencie po pobraniu całego pliku. Umożliwia to użytkownikowi wstrzymanie sesji pobierania i wznowienie.

Jeśli chodzi o wyznaczanie prędkości, mogą istnieć metody wcześniej przygotowane, aby to zrobić, ale jedną z metod, z których można skorzystać, jest po prostu zbudowanie własnego testu prędkości: Wyślij 1 MB do klienta (prześlij) i wyślij go odpowiedź raz otrzymana. 1100 podzielone przez czas potrzebny na uzyskanie odpowiedzi od klienta, to KB/s, które pobiera klient do pobrania z serwera. I vice versa, aby przetestować przesyłanie od klienta.

Jeśli chodzi o przesyłanie, polecam korzystanie z istniejących technologii. SFTP obsługuje uwierzytelniony szyfrowany transfer danych. Jest to w zasadzie FTP, ale przez SSH.Tam powinny być dostępne API do interakcji z tym.

Na marginesie, nigdy nie zrobiłem nic, o czym mówisz, ale mam nadzieję, że moje pomysły dadzą ci kilka opcji do rozważenia.