我有应用程序。在这里,我从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;,但我在日志中看到相同的消息。
答案 0 :(得分:15)
问题在于:您的字段idField
的类型为int
,因此在.NET中,它不能为null - 它始终必须具有有效的整数值,例如0
另一方面,XML模式将其定义为可选:
<xs:element minOccurs="0" name="ID" type="xs:int"/>
因此,.NET客户端无法知道0
中idField
的值是否意味着没有定义值(因为它有minOccurs=0
),或者是否真的是要将值0
发送到服务器。
这就是idFieldSpecified
发挥作用的地方:
如果idField
为0
且idFieldSpecified
为false
- >然后定义没有值(例如,有点像SQL中的NULL
)
如果idField
为0
且idFieldSpecified
为true
- >那么你真的想将0
值发送给调用者
因此,如果您的字段包含(field)Specified
字段,如果您想要实际发送值,那么必须将(field)Specified
值设置为 true - 否则设置的值为 NOT 已发送。