2009-06-26 6 views
7

J'ai créé un service Web via WCF. Ensuite, je l'ai exposé comme un service Web pour le rendre utilisable avec une application .NET 2.0. J'ai créé un DataContract avec DataMember qui pourrait être utilisé par le OperationContract exposé.Pourquoi l'attribut spécifié d'un DataMember de service Web doit-il être défini pour int et Data mais pas pour String

Je remarque que lorsque j'essaie de créer DataClass à transmettre dans le service Web, chaque attribut DataContract possède désormais un attribut "Spécifié" partenaire pour chaque membre.

Par exemple:

[DataContract] 
public class Sales 
{ 

    [DataMember] 
    public int InvoiceNo; 

... 
} 

Lorsque je crée une instance de ventes dans le client de service Web. J'ai l'attribut nommé InvoiceNo et InvoiceNoSpecified. Maintenant, voici ma question, quand l'attribut est de type string, je n'ai pas besoin de mettre l'attribut "Specified" correspondant à true, mais quand le type d'attribut est un int ou DateTime, si je ne mets pas le L'attribut "Specified" correspondant à true, la valeur devient nulle dans l'hôte de service Web. Est-il possible d'éviter de définir l'attribut spécifié? Parce que je dois appeler les fonctions de service Web dans beaucoup d'endroits dans mon code. Ce serait vraiment difficile de les suivre tous.

Répondre

3

Vous pouvez lire l'explication here.

Citation de :

Si un schéma comprend un élément qui est en option (minOccurs = '0'), ou si le schéma comprend une valeur par défaut, vous avez deux options. Une option consiste à utiliser System.ComponentModel.DefaultValueAttribute pour spécifier la valeur par défaut, comme indiqué dans le code suivant. Une autre option consiste à utiliser un modèle spécial pour créer un champ booléen reconnu par le XmlSerializer et à appliquer le XmlIgnoreAttribute au champ. Le modèle est créé sous la forme propertyNameSpecified. Par exemple, si il y a un champ nommé « MyFirstName » vous aussi créer un champ nommé « MyFirstNameSpecified » qui indique XmlSerializer si vous souhaitez générer l'élément XML nommé « MyFirstName ».

La seule acceptable pour moi solution que je suis venu jusqu'à présent est d'utiliser XmlSerializer au lieu de DataContractSerializer en utilisant XmlSerializerFormatAttribute.

+0

J'ai essayé d'utiliser DefaultValueAttribute pour celui-ci. Lorsque j'utilise une valeur par défaut, ce qui se passe est même si je définis la valeur du paramètre date dans le client.Comme je n'ai plus défini dateFrified = true, la valeur date est toujours la valeur par défaut. // code au client prm.DepositDate = dtp_Deposit.Value.Date; // code au service [DefaultValue (typeof (DateTime), "1900/01/01")] public DepositDate; – Nap

+0

Remerciez l'homme. J'ai eu le même problème avec les services soaplib python et les clients .net. J'ai toujours dû définir Spécifié à true. Voici un exemple pour le résoudre en Python: @rpc (soap_types.Int (min_occurs = 1), _returns = soap_types.String) – Elalfer

1

Aussi, vous pouvez utiliser [DataMember(isRequired=True)]

8

Les paramètres par défaut de l'attribut DataMember sont:

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

Si la propriété que vous exposiez est un type de valeur non annulable vous devez utiliser:

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