2009-06-26 4 views
7

Ho creato un servizio Web tramite WCF. Quindi l'ho esposto come servizio Web per renderlo utilizzabile con un'applicazione .NET 2.0. Ho creato alcuni DataContract con DataMember che potrebbero essere utilizzati dal OperationContract esposto.Perché un attributo specificato di un servizio DataMember deve essere impostato per int e Data ma non per String

Ho notato che quando provo a creare DataClass da passare nel servizio Web che ogni attributo DataContract ora ha un attributo "Specificato" partner per ogni membro.

Ad esempio:

[DataContract] 
public class Sales 
{ 

    [DataMember] 
    public int InvoiceNo; 

... 
} 

Quando creo un'istanza di vendite nel client di servizi web. Ricevo l'attributo denominato InvoiceNo e InvoiceNoSpecified.

Ora questa è la mia domanda, quando l'attributo è di tipo stringa, non è necessario impostare l'attributo "Specificato" corrispondente su true, ma quando il tipo di attributo è un int o DateTime, se non si imposta il corrispondente all'attributo "Specificato" su true, il valore diventa null nell'host del servizio Web. C'è un modo per evitare di impostare l'attributo Specificato? Perché devo chiamare le funzioni del servizio web in molti punti del mio codice. Sarebbe davvero difficile tenerne traccia di tutti.

risposta

3

Si può leggere la spiegazione here.

Citazione di :

Se uno schema include un elemento che è facoltativo (minOccurs = '0'), o se lo schema include un valore di default, si hanno due opzioni. Un'opzione è per utilizzare System.ComponentModel.DefaultValueAttribute per specificare il valore predefinito, come mostrato nel seguente codice. Un'altra opzione consiste nell'utilizzare un modello speciale per creare un campo booleano riconosciuto da XmlSerializer e per applicare il campo XmlIgnoreAttribute al campo. Il modello viene creato sotto forma di propertyNameSpecified. Per esempio, se c'è un campo denominato "MyFirstName" si potrebbe anche creare un campo denominato "MyFirstNameSpecified" che indica XmlSerializer se generare l'elemento XML denominato "MyFirstName".

solo accettabile per me la soluzione io sono venuto finora è quello di utilizzare XmlSerializer anziché DataContractSerializer utilizzando XmlSerializerFormatAttribute.

+0

Ho provato a utilizzare DefaultValueAttribute per questo. Quando utilizzo un valore predefinito, ciò che accade è anche se imposto il valore del parametro data nel client.Dal momento che non ho impostato dataSpecified = true, il valore della data è sempre il valore predefinito. // codice al client prm.DepositDate = dtp_Deposit.Value.Date; // codice al servizio [DefaultValue (typeof (DateTime), "1900/01/01")] DepositDate pubblico; – Nap

+0

Grazie amico. Ho avuto lo stesso problema con i servizi python soaplib e i client .net. Ho sempre dovuto impostare Specificato su true. Ecco un esempio su come risolverlo in Python: @rpc (soap_types.Int (min_occurs = 1), _returns = soap_types.String) – Elalfer

1

Inoltre è possibile utilizzare [DataMember(isRequired=True)]

8

I parametri predefiniti per l'attributo DataMember sono:

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

Se la proprietà si sta esponendo è un tipo di valore non annullabile si dovrebbe usare:

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