为啥带有附加字段“指定”的字段始终为空?
Posted
技术标签:
【中文标题】为啥带有附加字段“指定”的字段始终为空?【英文标题】:Why fields with additional field "Specified" are always null?为什么带有附加字段“指定”的字段始终为空? 【发布时间】:2013-10-31 09:37:36 【问题描述】:我有应用程序。这里我从 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)都是空的。
这个问题的原因是什么?我该如何解决?
更新——原因及解决办法
问题是:我没有“gsoap 服务器”的源代码。但是根据我们公司的协议,我们使用(可以观看)来自该应用程序的日志。此日志不正确(首先,此情况下没有日志消息。然后此消息不正确。修复后问题解决)。
还有很多带有“双”字段的类和结构。因此,在某些类的实例中,我设置了“...Specified = true;”。在另一种情况下,我没有设置“...Specified = true;”。修复日志后,我看到了问题。
所以我需要设置“...Specified = true;”在所有课程中。我不知道这个解决方案是否正确,因为
1)我问了我们公司的另一个程序员,但他们不知道wcf正常。
2) 设置“...Specified = true;”,但我在日志中看到相同的消息。
【问题讨论】:
【参考方案1】:问题是这样的:你的字段idField
的类型是int
,所以在.NET 中,它不能为空——它总是必须有一个有效的整数值,例如0.
另一方面,XML 模式将其定义为可选:
<xs:element minOccurs="0" name="ID" type="xs:int"/>
因此,.NET 客户端无法知道您的 idField
中的 0
值是否意味着没有定义值(因为它有一个 minOccurs=0
),或者您是否真的要发送值0
到服务器。
这就是idFieldSpecified
发挥作用的地方:
如果idField
是0
并且idFieldSpecified
是false
--> 那么没有值 被定义(例如有点像SQL 中的NULL
)
如果 idField
是 0
并且 idFieldSpecified
是 true
--> 那么你真的想将 0
值发送给调用者
因此,如果您的字段附带 (field)Specified
字段,如果您想实际发送一个值,那么您必须将 (field)Specified
值设置为 true - 否则设置的值不发送。
【讨论】:
谢谢。我的问题是我设置了所有值。 ID = 100 开始频率 = 1500 结束频率 = 2500;但在 gsoap 应用程序中,此字段为空(其他字段很好) @novicegis: 并且你设置他们随附的....specified
字段为TRUE ????如果您不将这些字段设置为 TRUE,那么您的值 不会 序列化到消息中!
好吧,那么gsoap
系统可能与您发送的那些 SOAP 消息有一些问题......
您是否尝试设置WCF Message Logging 以便查看发送到gsoap 的消息?
这是一个糟糕的设计。为什么 WCF 看不到 minOccurs="0"
而是生成 Nullable<int>
?以上是关于为啥带有附加字段“指定”的字段始终为空?的主要内容,如果未能解决你的问题,请参考以下文章