2011-01-25 21 views
7

Czy istnieje sposób na przesłanie pliku z lokalnego systemu plików do folderu na serwerze przy użyciu usług internetowych ASMX (bez WCF, nie pytaj dlaczego :)?Przesyłanie plików ASMX

UPD rozmiar

PSfile może być 2-10 GB

Odpowiedz

2

Podczas rozwijania mojego bezpłatnego narzędzia do przesyłania dużych plików na serwer, używam także .NET 2.0 i usług internetowych.

Aby aplikacja była bardziej odporna na błędy w przypadku bardzo dużych plików, zdecydowałem się nie przesyłać jednej dużej tablicy byte[], ale zamiast tego przesyłam "chuncked".

tj. do przesłania pliku 1 MB, nazywam moją funkcję wysyłania SOAP 20 razy, każde połączenie przekazuje tablicę byte[] o wielkości 50 KB i umieszcza ją ponownie na serwerze.

Ja również liczę paczki, kiedy jedna kropla, próbuję przesłać je ponownie kilka razy.

Dzięki temu przesyłanie danych jest bardziej odporne na błędy i bardziej responsywne w interfejsie użytkownika.

Jeśli jesteś zainteresowany, this is a CP article of the tool.

+1

Myślałem o tym. ale myślałem także, że może to spowodować dużą liczbę błędów :) – 2xMax

+0

Tak, zajęło to sporo czasu, aby zrobić coś okrągłego. –

9

Sure:

[WebMethod] 
public void Upload(byte[] contents, string filename) 
{ 
    var appData = Server.MapPath("~/App_Data"); 
    var file = Path.Combine(appData, Path.GetFileName(filename)); 
    File.WriteAllBytes(file, contents); 
} 

następnie wystawiać usługi wygenerować proxy klienta z WSDL, powoływać, standardowe rzeczy .

-

UPDATE:

widzę aktualizację teraz o obsługę dużych plików. Model MTOM protocol with streaming wbudowany w funkcję WCF jest zoptymalizowany do obsługi takich scenariuszy.

+0

bufor? Myślę, że masz na myśli zawartość .... – scartag

+0

co z dużymi plikami? – 2xMax

+0

@scartag, tak to miałem na myśli. –

0

W przypadku bardzo dużych plików jedynym skutecznym sposobem wysyłania ich do usług WWW jest MTOM. A MTOM to tylko supported in WCF, które wykluczyłeś. Jedynym sposobem, aby to zrobić ze starszymi serwisami internetowymi .asmx, jest odpowiedź udzielona przez Daniela Dimitrowa. Dzięki temu rozwiązaniu będziesz musiał ponieść koszt pliku zakodowanego base64 (33% więcej przepustowości).

0

Mieliśmy ten sam wymóg, zasadniczo przesyłając plik przez HTTP POST przy użyciu standardowych kontrolek FileUpload po stronie klienta. Ostatecznie dodaliśmy stronę ASPX do projektu usługi sieciowej ASMX (w końcu to tylko projekt internetowy) - to pozwoliło nam przesłać do np. http://foo/bar/Upload.aspx, gdy usługa internetowa była pod numerem http://foo/bar/baz.asmx. Utrzymało to funkcjonalność w serwisie internetowym, mimo że korzystała z oddzielnej strony internetowej.

To może, ale nie musi, spełniać twoje wymagania, @Darins podejście będzie również działać jako obejście, ale musiałbyś dokonać modyfikacji po stronie klienta, co nie było dla nas opcją.