2010-01-12 9 views
10

Mam dwie usługi WCF .NET 3.5 budowane z VS2008.Jak zapobiec generowaniu właściwości "Określonych" w klientach WCF?

Mam dwóch klientów WCF w Silverlight do korzystania z tych usług. Klienci są generowani za pomocą "Add Service Reference". Używam Silverlight 4.

JEDEN z proxy jest generowany z Specified właściwości dla każdej nieruchomości. Jest to klasa „message-in” dla mojego metody usługi:

// properties are generated for each of these fields 
    private long customerProfileIdField;   
    private bool customerProfileIdFieldSpecified;   
    private bool testEnvField;   
    private bool testEnvFieldSpecified; 

Teraz moje inne usługi (nadal z Silverlight klienta) nie generować Specified właściwości.

Teraz nie dbam o "zasady dobrego SOA". Po prostu chcę pozbyć się tych cholernych właściwości, ponieważ w kontekście tego, co robię, absolutnie ich nienawidzę.

Musi istnieć jakaś różnica między tymi dwiema usługami - ale nie chcę całkowicie rozdzielać ich na części, żeby przekonać się o różnicy.

A similar question wcześniej otrzymałem odpowiedź "you cant do it" - co zdecydowanie nie jest prawdą, ponieważ ją mam - po prostu nie wiem, co zrobiłem inaczej.

Edytuj: Jestem teraz w sytuacji, w której regeneruję swoje proxy Silverlight 4 do mojej usługi 3.5 WCF (wszystkie na tej samej maszynie localhost), że czasami dostaję właściwości "Określone", a czasami nie. Nie myślę już (jak podejrzewałem pierwotnie), że jest to spowodowane jedynie pewną konfiguracją lub poziomem usług punktu końcowego [atrybut]. Istnieją pewne wyzwalacze w samym komunikacie, które powodują, że zostały wygenerowane (lub nie). Może być wiele czynników lub może to być bardzo proste.

+0

I rzeczywiście mają 3 usługi, które nie są tworzenie określonych właściwościach. Tylko czwarta robi! –

+0

Dodaj "[XMLSerializerFormat]" do atrybutów w usłudze: Sprawdź do tego [odpowiedź] (http://stackoverflow.com/questions/13396190/wcf-service-method-arguments-bool-specified) –

Odpowiedz

11

spróbować tego w usłudze WCF w którym nieruchomość jest zadeklarowanym

[DataMember(IsRequired=true)] 
public bool testEnvField { get; set; } 

IsRequired=true będzie negować potrzebę nieruchomości testEnvFieldSpecified

+0

co zrobić z tym globalnie ? teraz moja usługa, która tworzyła Specified properties, po prostu magicznie przestała je tworzyć. Właśnie dodałem drugą operację OperationContract z bardzo podobną wiadomością - więc wciąż jestem wkurzona wiedząc, co wyzwala to globalne zachowanie. –

+0

Jedynym powodem, dla którego mogłem zrozumieć, dlaczego 2 proxy generowało z SpecifiedField, a nie, jest od aplikacji klienckiej .n3.5 nie potrzebują właściwości "IsRequired", domyślnie przyjmują ją jako domyślną, gdy aplikacje .net2.0 potrzebują tego atrybutu, inaczej odczytują wsdl. Czy obie aplikacje SL4? – Neil

+0

@neil to ta sama pojedyncza aplikacja! Teraz doszedłem do punktu, w którym po ponownym kompilowaniu mojej aplikacji 3.5 i ponownym generowaniu proxy dla mojego klienta SL4, czasami otrzymuję "określony", a czasami nie. to staje się naprawdę frustrujące! coś w datamodelu powoduje to zachowanie –

0

OK znalazłem jedno, tak daleko, że spowoduje Specified właściwości być generowane:

  • Obecność w komunikacie XTypedElement.

Używane przez Linq2XSD. Zwróciłem element z modelu Linq2XSD.

Wywołało Specified właściwości mają zostać wygenerowane wszystko w moich klasach:

public XTypedElement Foo { get; set; } 

To jednak nie:

public XElement Foo { get; set; } 

Wciąż ciekaw, dlaczego tak jest, a jeśli takie istnieją inne rzeczy, które to uruchamiają.

+0

Nagle uzyskanie podobnego problemu w usłudze sieciowej, która działała jak napisana, chociaż nie używam XTypedElement lub Linq2XSD, a ja używam .NET 4.0 – speckledcarp

2

Te dodatkowe właściwości określone są generowane dla typów wartości, które są określone jako opcjonalne w kontrakcie lub znaczniku atrybutu.

Ponieważ typy wartości mają domyślnie wartość, dla tych właściwości dodawane są dodatkowe znaczniki Specified, aby umożliwić klientowi (i serwerowi) odróżnienie czegoś jawnie nieokreślonego lub jawnie określonego - które może być ustawione na wartość domyślna wartość. Bez tego liczby całkowite zawsze kończyłyby się liczbą 0 (i serializacją), nawet jeśli nie ustawisz ich (z powodu odwzorowania na int) w kodzie klienta. Więc kiedy to zrobisz, musisz również upewnić się, że ustawiłeś flagę Specified na true, w przeciwnym razie te właściwości nie zostaną przekształcone do postaci szeregowej.

Aby zapobiec generowaniu tych flag dla typów wartości, należałoby zmienić umowę, aby te właściwości typu wartości były obowiązkowe, a nie opcjonalne.

Mam nadzieję, że ma to sens.

+1

Prawo, które sprawia, że ​​p wadliwy sens, Z WYJĄTKIEM nie zawsze generuję je generowane nawet dla typów wartości. Obecnie wszystkie moje (nawet nie-nullable) booleans i 'int' NIE generują tych właściwości, ale od czasu do czasu zmieniają coś nieumyślnie w kontrakcie, który powoduje ich generowanie (i zdecydowanie nie dodaję przypadkowo [DataMember (IsRequired = true) ]). Naprawdę chciałbym wiedzieć, jak je trwale wyłączyć, aby zachowywały się jak "normalne" obiekty. –

+0

Te, które nie są zerowalne, powinny być w porządku, są to tylko typy * opcjonalne *, które to będą miały. –

+0

jest na odwrót.to nie-zerowalne pola, które wymagają określonych właściwości, ponieważ w przeciwnym razie nie wiedziałbyś, czy wartość domyślna (fałsz lub 0) jest tym, czego faktycznie chciał użytkownik. te opcjonalne po prostu nie istnieją, ale fakt, że są one opcjonalne, mówi, że jest OK. w obu przypadkach WSZYSTKIE moje właściwości kończą się uzyskiwaniem Specyfikowanych właściwości, które zasadniczo całkowicie wkręcają cały mój kod. musi być zestaw reguł, które określają, kiedy są generowane i kiedy nie są. nie jest tak proste, jak niedopuszczalna null (lub na szczęście w zależności od tego, jak na to patrzysz). –

0

UWAGA: zdaję sobie sprawę, że jest to stare pytanie. Dodaję to tutaj, ponieważ to pytanie pojawia się jako najlepszy wynik w Google i jest to przydatne informacje dla każdego, kto szuka.

spróbuj dodać tę linię do swojego oświadczenia o zamówieniu pracy:
[XmlSerializerFormat]

Powinno to wyglądać mniej więcej tak:

namespace WebServiceContract 
{ 
    [ServiceContract(Namespace = "http://namespace")] 
    [XmlSerializerFormat] //This line here will cause it to serialize the "optional" parameters correctly, and not generate the extra 
    interface InterfaceName 
    { 
     /*...Your web service stuff here...*/ 
    } 
} 
+1

Należy zauważyć, że to całkowicie zmienia silnik serializacji XML używany dla usługi sieci Web. (Zmiana z DataContractSerializer na XmlSerializer). Różne silniki używają innego zestawu atrybutów do sterowania wyjściem serializera, mają różne ograniczenia kompatybilności i różne charakterystyki wydajności. To nie drobna zmiana. – Hydrargyrum

Powiązane problemy