2009-10-23 8 views
5

Pracuję nad utworzeniem usług WCF, które będą działały niezależnie od klientów .Net. Dzięki Google i StackOverflow udało mi się stworzyć zarówno proste usługi xml, jak i json, bez pakowania Soap i mnóstwa fantazyjnych produktów WCF, których po prostu nie potrzebuję. To było bolesne doświadczenie, stąd temat tej kwestii. WCF to szalony buggy po stronie klienta podczas korzystania z WebGet i WebInvoke przy automatycznym dodawaniu referencji do usługi.Klient WCF (Add Service Reference) nienawidzi WebGet i WebInvoke ... naprawdę, robi to

Aby sprawdzić komunikację, tworzyłem klienta WCF lokalnie i przekazując wszystko przez Fiddler. W ten sposób, niezależnie od tego, czy działa, czy nie, mogę przynajmniej zobaczyć, co klient próbuje wysłać. A kiedy w końcu zadziała, widzę dane wysyłane z obu końców, a następnie duplikuję tę komunikację w kliencie innym niż .Net.

Mój obecny problem polega na tym, że gdy zmieniam usługę, aby oczekiwać danych POST jako json (zachowanie enableWebScript), klient nie ma pojęcia, i nadal próbuje wysłać obiekty jako xml. Miałem mnóstwo problemów z konfiguracją klienta, która nie była automatycznie ustawiana poprawnie podczas korzystania z Add Service Reference, więc mam nadzieję, że jest to coś prostego, co mogę dodać do app.config na kliencie. Używając XML, obiekty, które tworzę i wykorzystuję w usłudze, są automatycznie xml serializowane przez klienta (co jest najwygodniejsze). Czy jest to możliwe nawet w jsonie w bieżącej wersji WCF?

Należy zauważyć, że udało mi się wymyślić, co muszę zrobić ręcznie i zmusić go do pracy w surowej formie z Fiddler (konstruktor żądań), dzięki czemu mogę serializować moje obiekty w kodzie i wysyłać dane ręcznie przez http post ... tak to robię w moich klientach spoza sieci. Jest to raczej pytanie, aby lepiej zrozumieć aspekty WCF i dlaczego brakuje mi tak wielu atrybutów po stronie klienta, w których nie ma zbyt wiele dokumentacji, aby rozwiązać problemy.

+0

Mężczyzna .. Chciałbym przeczytać to wcześniej. Przeszliśmy przez dokładnie ten sam proces myślenia. Spodziewałem się, że klient REST "po prostu działa" tak, jak robi to klient SOAP. –

+0

Czy jesteś związany z WCF lub masz opcję technologii ładowania serwera/usługi? Odkąd opublikowałem to ponad dwa lata temu, opierałem się używaniu WCF do czegokolwiek. Każda usługa, którą tworzę lub spożyję ręcznie, tworzy lekkie dane xml i/lub json, a także wdrażam własne zabezpieczenia i wszystko inne, co WCF próbował uczynić wygodniejszym dla deweloperów. Wydaje mi się, że praktycznie niemożliwe jest znalezienie popularnego publicznego interfejsu API ujawnionego jako usługa WCF. – Rich

+0

Nie, nie jesteśmy związani z WCF, ale myślę, że moglibyśmy wypróbować go dla jednej z naszych usług. Budowanie komponentów po stronie serwera przy użyciu WCF było bolesne, dopóki nie zrozumieliśmy wszystkiego. Chociaż ... fajnie było nie budować punktów końcowych ręcznie (mamy działające SOAP/REST/JSON).Teraz zdaję sobie sprawę, że użyjemy SOAP, jeśli używamy klienta .NET i niech inni wykorzystają REST/JSON. –

Odpowiedz

3

Referencje usługi WCF dotyczą ładunków RPC, które są samoopisujące się - tj. SOAP, wsHttp itd. Równie silnie typowane klienty WCF są przeznaczone wyłącznie do obsługi ładunków RPC, ponieważ tylko one są w stanie transmitować wszystkie informacje o typie itd. wymagane, aby działał poprawnie.

Podczas korzystania z webget i webinvoke tworzysz usługi inne niż rpc (przeznaczone do pisania usług REST), które również nie są samoopisujące i dlatego nie są idealnie dopasowane do funkcji odniesienia do usługi.

Można oczywiście napisać do tego klienta .Net, ale o wiele łatwiej będzie go napisać za pomocą WebClient/WebRequest, ręcznie formatując/odczytując żądania/odpowiedzi XML/Json (lub używając DataContractSerializer i DataContractJsonSerializer aby pomóc w tym).

1

SOAP jest samoopisujący się (poprzez WSDL).

WebGet/WebInvoke nie ujawniają żadnych metadanych, które mówiłyby klientowi, aby używał JSON zamiast XML.

Powiązane problemy