2012-07-02 22 views
9

Jeśli mój kontrakt wygląda następująco:W jaki sposób można zapobiec parametrowi końcowemu zwracającemu parametrowi w usłudze sieciowej WCF?

[OperationContract] 
void DoSomething(int id, out string moreInfo); 

ten kończy się patrząc jak:

string DoSomething(int id); 

podczas importowania odniesienie usług internetowych. Czy można wpływać na automatyczną konwersję kolejności parametrów? Zaskakujące było już znalezienie wszystkich parametrów wyjściowych na początku sygnatury funkcji, ale było to nadal możliwe, ale chcielibyśmy, aby metody void były nadal nieważne. Czy to jest ograniczenie SOAP?

+1

W tym przypadku metoda void z pojedynczym parametrem 'out' jest efektywnie metodą nieważną z poprawną wartością zwracaną. Co definiuje parametr "out", co oznacza, że ​​nie ma wersji "poza"? –

+0

@AdamHouldsworth ortogonalność w projektowaniu usług internetowych. Pierwotnie mieliśmy usługi, które zwróciły wartość, a które nie. Jednak każda usługa była refaktoryzowana, aby zwracać statusy. Poprzez wymuszenie dodatkowego paramu, kompilacja automatycznie zawiedzie i wiemy, co naprawić, a ponadto po prostu wygodnie jest wiedzieć, że pierwszy param jest out-paramem zawierającym statusy, niezależnie od reszty umowy. – Abel

+3

Jestem bardzo zaskoczony i pod wrażeniem, że WCF był w stanie wygenerować proxy dla tej operacji! Jakie jest uzasadnienie używania parametru 'out' w pierwszej kolejności? – MattDavey

Odpowiedz

4

Wydaje się być oparte na ograniczenie WSDL: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/48b5992f-f7bd-4b67-8299-514d1780fa9a

WSDL nie zobaczyć oryginalny podpis metody; zamiast tego pokazuje on parametry wejściowe jako grupę, a parametry wyjściowe jako inną grupę .

Ograniczenie polegające na tym, że nie można oddzielić wartości zwrotnych od parametrów wyjściowych, znajduje się w pliku WSDL. Ale to oznaczałoby, że ograniczenie metody pustej byłoby częścią svcutil.exe, jak sądzę. Nie ma powodu, dla którego nie byłoby przełącznika na svcutil, aby nie przesuwać pierwszego wyjścia do wartości zwracanej, ale byłoby to żądanie dla funkcji na ms connect.

Zamiast unieważnić, możesz zwrócić prosty status int lub bool, jeśli problem jest spójny, ale jestem pewien, że nie jest to idealna odpowiedź, jeśli masz już dziesiątki metod.

+1

Stało się po tym samym linku kilka minut temu. Rzeczywiście, wydaje się, że jest to ograniczenie bazowego WSDL. Opakowanie może oczywiście wykorzystywać dowolną kolejność, ale nie widzę przypadku użycia, aby to wymusić. Obejmiemy ograniczenia, a przynajmniej użyjemy typu VoidResponse, aby na razie ułatwić refaktoryzację. – Abel

+0

Dobry pomysł na typ VoidResponse. –