2013-10-22 15 views
6

Ho l'app. Qui creo il servizio client da WSDL. Oggi alcune funzioni funzionano normalmente. Ma alcuni hanno torto.Perché i campi con campo aggiuntivo "Specificato" sono sempre nulli?

È una parte da WSDL

<xs:complexType name="TStartInfoCalcZoneViewForArea"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="ID" type="xs:int"/> 
     <xs:element minOccurs="0" name="startFreq" type="xs:double"/> 
     <xs:element minOccurs="0" name="endFreq" type="xs:double"/> 
     <xs:element minOccurs="0" name="startTime" type="xs:string"/> 

Si tratta di una parte in C#

public partial class TStartInfoCalcZoneViewForArea 
{ 

    private int idField; 

    private bool idFieldSpecified; 

    private double startFreqField; 

    private bool startFreqFieldSpecified; 

    private double endFreqField; 

    private bool endFreqFieldSpecified; 
/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=0)] 
public int ID 
{ 
    get 
    { 
     return this.idField; 
    } 
    set 
    { 
     this.idField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool IDSpecified 
{ 
    get 
    { 
     return this.idFieldSpecified; 
    } 
    set 
    { 
     this.idFieldSpecified = value; 
    } 
} 

ho impostato il valore di questi campi. Per esempio

.ID = 100; 
.IDSpecified = true; // I set nothing, false. But result is same. 

Il problema è che tutti questi campi (ID, endFreq, startFreq) sono nulli in assistente gsoap.

Qual è il motivo di questo problema? Come posso ripararlo?

Aggiornamento - la ragione e la soluzione

Il problema era: non ho il codice sorgente del "server gsoap". Ma sull'accordo nella nostra azienda usiamo (possiamo guardare) il log da questa applicazione. Questo registro non era corretto (prima di tutto non ci sono messaggi di registro in questa situazione, quindi questi messaggi non erano corretti. Dopo aver risolto il problema è stato risolto).

Inoltre ci sono molte classi e strutture con campo "doppio". Quindi, in alcune classi ho impostato "... Specified = true;". In un altro caso non ho impostato "... Specified = true;". Dopo che il registro è stato corretto, vedo il problema.

Quindi ho bisogno di impostare "... Specified = true;" in tutte le classi. Non so se questa soluzione sia corretta, perché

1) Chiedo a un altro programmatore nella nostra azienda, ma non sanno wcf normale.

2) impostare "... Specificato = vero;", ma nel registro vedo lo stesso messaggio.

risposta

9

Il problema è questo: il tuo campo idField è di tipo int, quindi in .NET, non può essere nullo - dovrà sempre avere un valore intero valido, ad es. 0.

D'altra parte, lo schema XML definisce come optional:

<xs:element minOccurs="0" name="ID" type="xs:int"/> 

Quindi non c'è modo che il client .NET può sapere se quel valore di 0 nel vostro idField significa che non c'è valore definito (poiché ha un valore minOccurs=0) o se si intende realmente inviare il valore 0 al server.

Ecco dove l'idFieldSpecified entra in gioco:

  • se idField è 0 e idFieldSpecified è false -> quindi alcun valore è stato definito (per esempioun po 'come NULL in SQL)

  • se idField è 0 e idFieldSpecified è true -> allora davvero si vuole inviare il valore 0 al chiamante

Quindi, se avete i campi che hanno un che accompagna (field)Specified campo, se si desidera inviare in realtà un valore, allora si must impostare il (field)Specified valore su true - altrimenti il ​​valore impostato NON è inviato.

+0

Grazie. Il mio problema è che imposto tutti i valori. ID = 100 startFreq = 1500 endFreq = 2500; Ma nell'applicazione gsoap questi campi sono nulli (altri campi sono buoni) – novicegis

+1

@novicegis: e ** hai impostato ** il loro campo di accompagnamento '.... specificato' a ** VERO ** ???? Se non imposti questi campi su ** TRUE **, allora i tuoi valori ** NON saranno ** serializzati nel messaggio! –

+0

Sì, ho impostato true – novicegis

Problemi correlati