7

我有应用程序。这里我从 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;”。修复日志后,我看到了问题。

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

1)我问了我们公司的另一个程序员,但他们不知道wcf正常。

2) 设置“...Specified = true;”,但我在日志中看到相同的消息。

4

1 回答 1

19

问题是这样的:您的字段idField类型为int,因此在 .NET 中,它不能为空 - 它总是必须有一个有效的整数值,例如 0。

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

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

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

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

  • if idFieldis 0and idFieldSpecifiedis false--> then no value is defined (eg a bit like NULLin SQL)

  • if idFieldis 0and idFieldSpecifiedis true--> 那么你真的想将0值发送给调用者

因此,如果您的字段有一个伴随(field)Specified字段,如果您想实际发送一个值,那么您必须将该(field)Specified值设置为true - 否则不会发送该值集。

于 2013-10-22T13:40:45.313 回答