C# WCF file split/join wysyłanie/odbieranie duzych plików

0

Witam

Jest problem, jest wyzwanie, może być to zlecenie na doradztwo :)
Jest usługa WCF logika aplikacji na serwerze, posiada dwa typy klientów : widok w Delphi i widok w php

teraz : trzeba przesłać duży plik z Delphi, dowolnego typu, może być word excel, pdf - zakładamy 10-15 Mega i zapisać go w BD.
Pliki trzeba będzie odsyłać, tak aby ludek siedzący przed monitorem plik mógł odebrać w niezmienionym kształcie

znane problemy :
Używamy basichttpbinding - php ma problem z innymi z tego co wiem.
Delphi do wersji XE (nowszych nie próbowałem) ma problem z ilością danych - słabo idą po WCF rzeczy powyżej 5 mega, częste timeouty i przekroczony bufor.

Pytanie nr 1 brzmi : jak odpowiednio dzielić i składać ten plik po stronie usługi ? kod z delphi też by sie przydał ;)
kodowanie na serwerze czasami odbiega od Klienta. (pl klient, eng win SRV)
pytanie numer 2 : jak duże części radzicie transportować? ja myslałem 64kb - tyle ile domyślnie max dla WCF
Pytanie numer 3 : jak radzicie zapisywać to w bazie ? składać na żywca i zapisywać cały plik w transakcji, czy do osobnych blobów wkładać kazdy part, i składać dopiero przy odsyłce ?
Pytanie numer 4 : czy wprowadzać sumy kontrolne i jeśli tak to jaki algorytm radzicie użyć ?

0

a może obok WCFa wysyłać te pliki "normalnie" (tj. przez gniazda). Od WCFa dostawał byś np. nr portu (który np. będzie oczekiwał na połączenie przez najbliższe 30s, może być zawsze ten sam) i jakiś klucz (o stałej długości ale dla każdego połączenia inny), który musiałby być wysłany przed właściwymi danymi. Potem z delphi/php wysyłasz plik na dany ip/port. W drugą stronę podobnie ale zamiast wysyłać to byś odbierał. Na pewno współgra komunikacja na gniazdach między c# i delphi (php nie próbowałem) i nie jest trudna do implementacji. Zaletą będzie przede wszystkim prędkość (czegokolwiek byś nie opakował w SOAP zawsze będzie ważyć więcej niż "czyste" dane), niezawodność (jak dobrze zaimplementujesz to o ile fizycznie nie stracisz połączenia to plik zawsze dojdzie), odpada zabawa w porcjowanie danych i nie jest wcale takie trudne w implementacji.

1

Jest dużo prostszy sposób. Strumieniowanie wiadomości - mechanizm wbudowany w WCF, dostępny w basicHttpBinding (w netTcp też, ale rozumiem, że z tego nie korzystamy).
Tutaj opis (po angielsku), jak to włączyć:
http://msdn.microsoft.com/en-us/library/ms789010.aspx

W skrócie:

  • Zdefiniować kontrakt (operationcontract) tak, aby przyjmował tylko 1 parametr typu "Stream"

  • Włączyć strumieniowanie w configu kanału:

<basicHttpBinding>
  <binding name="HttpStreaming" maxReceivedMessageSize="67108864"
           transferMode="Streamed"/>
</basicHttpBinding>
 

Dodatkowe źródło:
http://cgeers.com/2009/08/20/using-wcf-services-with-php-5/
Ładnie opisane jak zrobić przykładową usługę czytającą strumień i "skonsumować" ją za pomocą PHP 5, gotowe jak na tacy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1