在Java Web服务和与之通信的.NET客户端之间看到一些奇怪的东西。我们正在来回发送一个带有DateTime
属性的对象。像这样(从WSDL生成):
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://ournamespace.com/")]
public partial class myClass {
private System.DateTime expirationDateField;
private string nameField;
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public System.DateTime expirationDate {
get {
return this.expirationDateField;
}
set {
this.expirationDateField = value;
}
}
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string name {
get {
return this.nameField;
}
set {
this.nameField = value;
}
}
}
我们正在接收带有日期的对象,但是当我们将它们发送回Web服务时,expirationDate
属性显示为null
。我们查看了Java服务器正在接收的原始XML以及expirationDate
的标记不存在,有点像这样:
<myClass><name>My Name</name></myClass>
(这不是确切的XML,但足够接近)。我仔细检查过,expirationDate
肯定是在发送之前在.NET客户端上设置的。 WSDL的XSD看起来并不奇怪:
<xs:element name="Expiration" type="xs:dateTime" minOccurs="0"/>
我们对其他东西使用相同的类型,也可以正常工作。在.NET方面,我们使用wsdl.exe
工具生成类和代码。
我们可以采取的另一个步骤是在调用Web服务之前查看.NET生成的XML,但我不知道该怎么做。还有其他想法或建议吗?
答案 0 :(得分:4)
当模式中的值类型是可选的时,WSDL.EXE会为值生成属性,并使用bool属性来指示值是否存在。如果要发送过期日期,则应该有一个ExpirationSpecified属性需要设置为 true ,否则应该 false 。
答案 1 :(得分:1)
除了我接受的John的答案之外,我还想说明完整的机制。每当对应于“不可为空”的C#类型的“可空”java类型被用作Web服务对象类型属性时,就会发生这种情况。例如,如果使用Java中的原始包装类型(如“Integer”,“Boolean”),则这些类型对应于不可为空的int,bool。因此,应设置“* Specified”属性以便发送它们。
原始文件,您可以参考:
http://msdn.microsoft.com/en-us/library/exchange/bb402199%28v=exchg.140%29.aspx