为什么带有附加字段“指定”的字段始终为空?

时间:2013-10-22 13:24:01

标签: c# wcf service wsdl gsoap

我有应用程序。在这里,我从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.

问题是gsoap服务器中的所有字段(ID,endFreq,startFreq)都为空。

这个问题是什么原因造成的?我该如何解决?

更新 - 原因和解决方案

问题是:我没有&#34; gsoap服务器&#34;的源代码。但根据我们公司的协议,我们使用(可以观察)此应用程序的日志。这个日志不正确(首先,在这种情况下没有日志消息。然后这些消息不正确。修复后问题解决了)。

还有很多类和结构用&#34; double&#34;领域。因此,在某些类的实例中,我设置了#34; ... Specified = true;&#34;。在另一种情况下,我没有设置&#34; ... Specified = true;&#34;。修复日志后,我看到了问题。

所以我需要设置&#34; ... Specified = true;&#34;在所有课程中。我不知道这个解决方案是否正确,因为

1)我问我们公司的其他编程人员,但他们不知道wcf正常。

2)set&#34; ... Specified = true;&#34;,但我在日志中看到相同的消息。

1 个答案:

答案 0 :(得分:15)

问题在于:您的字段idField的类型为int,因此在.NET中,它不能为null - 它始终必须具有有效的整数值,例如0

另一方面,XML模式将其定义为可选:

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

因此,.NET客户端无法知道0idField的值是否意味着没有定义值(因为它有minOccurs=0),或者是否真的是要将值0发送到服务器。

这就是idFieldSpecified发挥作用的地方:

  • 如果idField0idFieldSpecifiedfalse - >然后定义没有值(例如,有点像SQL中的NULL

  • 如果idField0idFieldSpecifiedtrue - >那么你真的想将0值发送给调用者

因此,如果您的字段包含(field)Specified字段,如果您想要实际发送值,那么必须(field)Specified值设置为 true - 否则设置的值为 NOT 已发送。