2009-06-26 6 views
7

Utworzono usługę WWW za pośrednictwem WCF. Następnie udostępniłem go jako usługę internetową, aby była użyteczna w aplikacji .NET 2.0. Stworzyłem niektóre DataContract z DataMember, które mogłyby być wykorzystane przez wystawiony OperationContract.Dlaczego atrybut określony w usłudze Web Service DataMember musi być ustawiony dla int i Data, ale nie dla String

Zauważyłem, że gdy próbuję utworzyć DataClass, która ma być przekazana w usłudze WWW, każdy atrybut DataContract ma teraz atrybut "Określony" partnera dla każdego elementu członkowskiego.

Na przykład:

[DataContract] 
public class Sales 
{ 

    [DataMember] 
    public int InvoiceNo; 

... 
} 

Kiedy tworzę instancję klienta w sprzedaży usług internetowych. Otrzymuję atrybut o nazwie InvoiceNo i InvoiceNoSpecified.

Oto moje pytanie, kiedy atrybut jest typu ciąg, nie muszę ustawiać odpowiadającego atrybutu "Określony" na true, ale gdy typem atrybutu jest int lub DateTime, jeśli nie ustawię odpowiadający atrybut "Specified" to true, wartość staje się pusta w hoście usługi WWW. Czy istnieje sposób na uniknięcie ustawiania określonego atrybutu? Ponieważ muszę wywoływać funkcje usługi sieciowej w wielu miejscach w moim kodzie. Naprawdę trudno byłoby śledzić je wszystkie.

Odpowiedz

3

Można przeczytać objaśnienie here.

Cytat :

Jeśli schemat zawiera element, który jest opcjonalne (minOccurs = '0'), lub jeśli schemat zawiera wartość domyślną, masz dwie opcje. Jedną z opcji jest użycie System.ComponentModel.DefaultValueAttribute , aby określić domyślną wartość, jak pokazano w poniższym kodzie. Inną opcją jest użycie specjalnego wzorca do utworzenia pola logicznego rozpoznawanego przez XmlSerializer, a także do zastosowania w tym polu atrybutu XmlIgnoreAttribute na . Wzór jest tworzony w postaci propertyNameSpecified. Na przykład, jeśli znajduje się pole o nazwie „MyFirstName” byś również utworzyć pole o nazwie „MyFirstNameSpecified”, który nakazuje z XmlSerializer czy wygenerować element XML o nazwie „MyFirstName”.

Jedynym zaakceptowania dla mnie obejście Doszedłem tak daleko jest użycie XmlSerializer zamiast DataContractSerializer za pomocą XmlSerializerFormatAttribute.

+0

Próbowałem użyć DefaultValueAttribute dla tego. Kiedy używam wartości domyślnej, co się dzieje, nawet jeśli ustawię wartość parametru date w kliencie.Ponieważ nie ustawiłem wartości dateSpecified = true, wartość daty jest zawsze wartością domyślną. // kod na kliencie prm.DepositDate = dtp_Deposit.Value.Date; // kod usługi [DefaultValue (typeof (DateTime), "1900/01/01")] public DepositDate; – Nap

+0

Dziękuję człowieku. Miałem ten sam problem z usługami Pythona soaplib i klientami .net. Zawsze musiałem ustawić Określony na true. Oto przykład, jak to naprawić w Pythonie: @rpc – Elalfer

1

Również można użyć [DataMember(isRequired=True)]

8

domyślne parametry dla atrybutu DataMember są:

bool EmitDefaultValue (default true) 
bool IsRequired (default false) 

Jeśli właściwość jesteś narażając jest typem wartości nie pustych należy użyć:

[DataMember(IsRequired = true)] 
public int InvoiceNo;