Mam restful (webHttpBinding) self-hosted usługi WCF. Większość metod zwraca klientowi wersję xml lub json.Jak mogę przesłać odpowiedź z WCF bez buforowania?
Mam kilka metod GET, które wyzwalają długotrwałe metody i chciałbym strumień odpowiedzi dziennika do przeglądarki (lub aplikacji), aby użytkownik wiedział, co się dzieje. Byłoby to łatwe do osiągnięcia dzięki HttpContext.Current.Response.OutputStream.Write
. Niestety, HttpContext.Current
jest zawsze pusta w samohostowanej usłudze WCF, nawet jeśli dołączę konfigurację aspNetCompatibilityEnabled
(IIS niestety nie jest opcją).
Próbowałem AnonymousPipeServerStream
: WCF and streaming requests and responses
wraz z pierwszym ustawieniu:
OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;
context.ContentType = "text/plain";
tak, że odpowiedź przychodzi w przeglądarce nie pobrać strumienia do pliku, aby zapisać.
W Chrome to w ogóle nie działa - buforuje do końca. W IE lub wget wydaje się buforować około 4k (lub coś w tym samym czasie). Nie jest to dobre dla logowania, chyba że wypluję mnóstwo niepotrzebnych komunikatów, aby wymusić wyjście, a użytkownik nie wie, co się dzieje. Mogę tylko założyć, że tak jest, ponieważ odpowiedź jest właściwie odpowiedzią kawałków, a kawałki to 4k (a nie tylko pisanie do strumienia wyjściowego).
Poprawkę na chrome na wyjście najwyraźniej napisać trochę śmieci do treści przed wysłaniem chunked odpowiedź: Chunked transfer encoding - browser behavior, jednak nie sądzę, jest to możliwe w WCF.
więc możliwe rozwiązania Szukam:
- sposób zapisu OutputStream w WCF w self hostowane usługi (bez IIS). lub
- Sposób kontrolowania wielkości porcji w odpowiedzi na strumień (& sposób na napisanie najpierw niektórych treści, aby Chrome renderował porcje).
Inna opcja, jak sądzę, to porzucić WCF na rzecz czegoś bardziej przyjaznego REST (zaczynam myśleć, że WCF nie był właściwym wyborem). Jednak po napisaniu tak wiele w WCF teraz, wydaje się to nużącym zadaniem. O ile nie byłoby czegoś, do czego mógłbym się przełączyć, byłaby to łatwa migracja (np. Gdybym mógł ponownie użyć tych samych klas usług, być może mając tylko inne atrybuty). Może Nancy?
Czy Twoim zdaniem to, co próbuję zrobić, nie jest możliwe? – David
Myślę, że to zależy od tego, co próbujesz przesyłać strumieniowo. Czy to surowe dane, które przenosisz z jednego miejsca do drugiego? Strumieniowanie jest zwykle używane w przypadku ogromnych zbiorów danych (tj. Przesyłamy muzykę i filmy z Amazon), a po rozpoczęciu przesyłania strumieniowego klient i host są w stanie blokady, wysyłania i odbierania do czasu zakończenia procesu. Nie jestem pewien, jak lub dlaczego chcesz wstrzyknąć coś w ten rodzaj przepływu. Jeśli martwisz się, że Twój użytkownik robi coś dziwnego, ponieważ nie widzi postępu, istnieją sposoby (jak opisuję) wokół tego problemu. – Brian
Próbuję przesyłać strumieniowo informacje dotyczące rejestrowania (patrz OP). Tak więc ilość danych może różnić się od kilku linii (jeśli wszystko idzie dobrze) do 1000 linii, jeśli coś idzie źle. To jest coś, co zrobiłem w przeszłości bez problemu, pisząc do strumienia wyjściowego (w .NET i innych językach), ale problem wydaje się, że WCF nie daje mi elastyczności, której szukam. – David