Webserwis WCF- przesyłanie danych binarnych

0

Witam,

Potrzebuję przepchnąć sporo danych binarnych przez webserwis WCF. Istotną rzeczą jest fakt, że webserwis stoi na łączu GPRS, przeciętna prędkość transferu poniżej 10 kB/s, a przeważnie poniżej 5 kB/s i timeouty rzędu 1.5 s.
Ilosć danych moze przekroczyc kilka MB.

Nie jest istotny czas transmisji - może to byc i kilka dni. Istotna jest za to pewność i niezawodność transmisji, a idealnie by było móc wznawiać transmisję przy chwilowych zanikach sygnału (wiadomo, GPRS). Czego najlepiej byłoby tu użyć? Myślałem o MTOM i ewentualnie napisaniu własnego kanału transmisji z kompresją. Ale nie mam za bardzo pomysłu jak wznawiać przerwany transfer...

Ale może jest lepszy sposób? .NET framework 3.0, wyższy nie wchodzi w grę.

0

MSMQ

0

Cos takiego jak tu? http://sukasom.wordpress.com/2008/08/18/wcf-and-msmq-part-1/
Moge wiedziec co konkretnie mi to daje i czy da sie tego użyc z mtom/transferMode Streamed ?

0

Ok, spytam inaczej - czy używając np. msmqTransport (zamiast httpTransport) moge w jakis sposob zapewnic buforowany transfer plików binarnych?

Przykład bez msmq:

 <bindings>
      <customBinding>
        <binding name="streamingBinding">
          <mtomMessageEncoding />
          <httpTransport transferMode="Streamed" maxReceivedMessageSize="10067108864"/>
        </binding>
      </customBinding>
    </bindings>

W takim wypadku jeżeli klient chce np. pobrac plik z serwera, wystarczy zwrócić mu strumień, czyli cos takiego:

public RemoteFileInfo DownloadFile(DownloadRequest request)
        {
            // pobierz info pliku
            //string filePath = System.IO.Path.Combine("Upload", request.FileName);

            string filePath = request.FileName;
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

           
            Console.WriteLine("Wysyłam " + request.FileName + " do klienta");
            Console.WriteLine("Rozmiar: " + fileInfo.Length);

            // czy istnieje
            if (!fileInfo.Exists) throw new System.IO.FileNotFoundException("Plik nie istnieje", request.FileName);

            // otwórz strumień
            System.IO.FileStream stream = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);

            // zwróć wynik
            RemoteFileInfo result = new RemoteFileInfo();
            result.FileName = request.FileName;
            result.Length = fileInfo.Length;
            result.FileByteStream = stream;
            return result;
        }

Wszystko bardzo fajnie, jezeli transmisja nie przerwie sie w trakcie, na przykład z powodu utraty połączenia. Interesuje mnie mechanizm, który automatycznie wznowi transmisję gdy połączenie znów będzie zestawione. Czy jest to możliwe?

Oczywiscie w przypadku, gdy chwilowo padnie łączność podczas transferu mogę po jej powrocie dalej kontynuować transfer, ale takie rozwiązanie nie bardzo mnie satysfakcjonuje, bo jest dość kłopotliwe w implenetacji - w tym przypadku w RemoteFileInfo musiałbym jeszcze podawać od jakiego miejsca w pliku chcę rozpocząć przerwany transfer. Wolałbym jednak jakis wbudowany mechanizm, o ile taki istnieje.

[dodano]
Widzę, że msmq tez zapewnia transfer strumieniowy, ale jeżeli wiadomość będzie traktowano jako całość to i tak niewiele mi daje :/

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