2013-10-22 60 views
6

我有應用程序。在這裏我從WSDL生成客戶端服務。現在一些功能正常工作。但有些人錯了。爲什麼添加字段「指定」的字段總是空?

距離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"/> 

的一部分,是在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; 
    } 
} 

予設定值到該字段的一部分。例如

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

的問題是,所有這些字段(ID,endFreq,startFreq)是gSOAP的服務器空。

這個問題的原因是什麼?我該如何解決它?

更新 - 原因和解決方案

的問題是:我沒有「gSOAP的服務器」的源代碼。但根據我們公司的協議,我們使用(可以觀看)來自此應用程序的日誌。這個日誌是不正確的(首先,在這種情況下沒有日誌消息,然後這個消息是不正確的,修復後問題解決了)。

也有很多類和結構與「雙」字段。所以在某些類的實例中,我設置了「... Specified = true;」。在另一種情況下,我沒有設置「......指定=真實」。日誌修復後,我看到了問題。

所以我需要設置「... Specified = true;」在所有的班級。我不知道這是正確的解決方案,因爲

1)我問我們公司的另一位程序員,但他們不知道wcf正常。

2)set「... Specified = true;」,但我在日誌中看到相同的消息。

回答

9

問題是這樣的:您的字段idField的類型爲int,因此在.NET中,它不能爲空 - 它總是必須具有有效的整數值,例如, 0

在另一方面,XML模式將其定義爲可選:

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

因此,有沒有辦法,.NET客戶端可以知道0idField該值是否意味着沒有值定義(因爲它有一個minOccurs=0),或者是否確實是要將值0發送到服務器。

這就是其中idFieldSpecified進場:

  • idField如果是0idFieldSpecifiedfalse - >然後沒有價值定義(例如有點像SQL NULL

  • 如果idField0idFieldSpecifiedtrue - >那麼你真的想要的0值發送給調用者

所以,如果你有一個有一個領域伴隨(field)Specified字段,如果你想實際發送一個值,那麼你必須設置(field)Specified值爲true - 否則設置的值是不是發送。

+0

謝謝。我的問題是我設置了所有的值。 ID = 100 startFreq = 1500 endFreq = 2500;但在gsoap應用程序中,這些字段爲空(其他字段很好) – novicegis

+1

@novicegis:和**是否設置了**隨附的....指定的字段爲真TRUE **如果您沒有將這些字段設置爲** TRUE **,那麼您的值**不會被序列化到消息中! –

+0

是的,我設置爲true – novicegis