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
Odpowiedz
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.
Każdy pomysł, jak utrwalić "kawałki" "po stronie serwera (powiedzmy w WCF) i ponownie zmontować? – atconway
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
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
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.
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
+1 Naprawdę dobre pytanie, chciałbym mieć dobrą odpowiedź. Jak duży plik mówimy? – AnthonyWJones
Tam pliki wav, które mogą wynosić nawet około 150+ megs – herbrandson