Jest to problem, który badałem w zeszłym tygodniu i nie mogę znaleźć rozwiązania. Znaleziono posty z prośbą o to samo, ale nigdy nie otrzymuję odpowiedzi, mam nadzieję, że to pomoże także innym.Jak przerwać strumień z usługi WCF bez czytania do końca?
Mam usługę WCF
, która zwraca obiekt zawierający w środku stream
. Używam basicHttpBinding
z przesyłaniem strumieniowym i Mtom, aby wysłać je do klienta.
Klient wywołuje usługę WCF
i zamyka serwer proxy natychmiast po otrzymaniu obiektu odpowiedzi.
Następnie klient odczytuje strumień pobrany z usługi WCF i zapisuje go w pliku na dysku lokalnym. Wszystko to działa dobrze.
Mój problem polega na tym, że klient chce przerwać operację i przestać pobierać dane z usługi WCF. Jeśli wywołam .close()
w strumieniu, np .: serverReply.DataStream.Close();
, to blokuje i odczytuje cały strumień z usługi WCF do końca przed kontynuowaniem. Strumień może być dość duży, a sieć nie zawsze jest szybka.
Jest to bardzo niepożądane w przypadku wykorzystania zasobów sieciowych, które są w zasadzie marnowane na dane, które już nie są potrzebne. A ponieważ basicHttpBinding
zezwala tylko na dwa równoczesne połączenia TCP (domyślnie) z serwerem usługi WCF, blokuje inne próby połączenia, dopóki strumień nie zostanie odczytany do końca.
Mogłabym zwiększyć liczbę jednoczesnych połączeń, ale byłoby to złe rozwiązanie, ponieważ spowodowałoby to kłopot.
Na przykład 20 przerwanych pobrań, które wciąż pobierają dane, aby je wyrzucić. Muszę sprawić, żeby transfer całkowicie się zatrzymał.
Na kliencie obiekt strumieniowy jest zwykłą klasą Stream
, więc zawiera tylko metodę ścisłą, nic więcej.
Wywołanie .close()
lub na obiekcie proxy nie pomaga, ani nie niszczy go za pomocą .dispose()
lub jakiejkolwiek innej metody. Po stronie serwera obsługuję zdarzenie OperationContext.OperationCompleted
, ale nie jest ono wywoływane, dopóki dane z stream
nie zostaną odczytane do końca.
Pytanie brzmi: jak zamknąć/przerwać transmisję bez jej całkowitego przeczytania?
Czy to szczęście? – Schultz9999
Cierpienie z tym samym problemem podczas wysyłania naprawdę dużych plików ... wydaje się, że brakuje czegoś naprawdę oczywistego. prawdopodobnie będę musiał wdrożyć chunking jako obejście tego problemu. –