2009-12-06 20 views
5

Mam aplikację Silverlight, która musi przesłać duże pliki na serwer. Przyjrzałem się przesyłaniu przy użyciu zarówno WebClient, jak i HttpWebRequest, jednak nie widzę oczywistego sposobu przesyłania strumienia z żadną opcją. Zrób do rozmiaru plików, ładując całą zawartość do pamięci, zanim upakowanie nie będzie rozsądne. Czy to możliwe w Silverlight?Przesyłanie strumieniowe Silverlight

+0

+1 Naprawdę dobre pytanie, chciałbym mieć dobrą odpowiedź. Jak duży plik mówimy? – AnthonyWJones

+0

Tam pliki wav, które mogą wynosić nawet około 150+ megs – herbrandson

Odpowiedz

1

Można zastosować podejście "kłujące". Silverlight File Uploader na Codeplex wykorzystuje tę technikę:

http://www.codeplex.com/SilverlightFileUpld

Biorąc pod uwagę wielkość kawałek (np 10k, 20k, 100k, etc), można podzielić plik i wysłać każdy kawałek z serwerem za pomocą protokołu HTTP żądanie. Serwer będzie musiał obsłużyć każdą porcję i ponownie skompletować plik, gdy nadejdzie każdy kawałek. W scenariuszu farmy internetowej, gdy jest wiele serwerów sieciowych - należy uważać, aby nie używać lokalnego systemu plików na serwerze WWW dla tego podejścia.

+0

Każdy pomysł, jak utrwalić "kawałki" "po stronie serwera (powiedzmy w WCF) i ponownie zmontować? – atconway

+1

Użyłem dwóch technik: 1) zapisz każdą porcję jako plik w systemie plików, gdy się pojawi, a następnie ponownie zmontuj pliki we właściwej kolejności po zapisaniu wszystkich porcji i 2) zapisz każdą porcję jako dane binarne w bazę danych, a następnie ponownie zmontuj. Będziesz musiał użyć techniki # 2 lub jakiegoś rozproszonego systemu plików, jeśli Twoja strona jest ładowana na więcej niż jednym serwerze WWW. – kindohm

+0

Ponieważ moja lokalizacja systemu plików znajduje się na tym samym serwerze, na którym istnieje serwer WCF i jest * nie * serwerem równoważenia obciążenia, myślę, że # 1 będzie działać naprawdę dobrze. Czy masz jakieś przykłady pisania fragmentów i ponownego składania? Jakiego rodzaju czytnika/pisarza używałbyś? Dzięki za pomoc. – atconway

1

Wydaje się niezwykłe, że WebClient w Silverlight nie zapewnia sposobu pompowania strumienia do serwera z postępem zdarzeń. Jest to szczególnie niesamowite, ponieważ jest to oferowane do przesyłania ciąg!

Możliwe jest zakodowanie tego, co wydaje się robić, co chcesz, za pomocą HttpWebRequest.

Podczas oddzwonienia do BeginGetRequestStream można uzyskać strumień dla wychodzącego żądania, a następnie odczytać porcje ze strumienia pliku i zapisać je do strumienia wyjściowego. Niestety Silverlight nie rozpoczyna wysyłania danych wyjściowych na serwer, dopóki strumień wyjściowy nie zostanie zamknięty. Tam, gdzie wszystkie te dane są przechowywane, nie wiem, możliwe, że jeśli będzie wystarczająco duży, SL może użyć pliku tymczasowego, aby nie obciążać pamięci urządzenia, ale może po prostu zapisać je w pamięci tak czy inaczej.

Jedynym rozwiązaniem, które może być możliwe, jest napisanie protokołu HTTP przez gniazda.

+0

Piszę trochę o gniazdach i problem polega na tym, że gniazda Silverlight nie mogą łączyć się z portem 80 (tylko od 4502 do 4534) – herbrandson

Powiązane problemy