我通过从XML模式生成WSDL和类,用Java编写了一个JAX-WS Web服务。
我在Visual Studio中将该服务添加为Web引用,以与C#.NET客户端应用程序一起使用。
原始XML模式使用几种日期/时间类型:xs:date和xs:dateTime用于某些元素。
我的问题是我的'dateTime'类型无法正常工作。它在生成的类(由Visual Studio 2010中的XMLSerializer生成)中转换为.NET DateTime对象(正确),然后我可以创建自己的DateTime对象并在其中一个类上设置DateTime。但是,当将请求发送回服务器时,客户端应用程序正在发送空值而不是我将其设置为的DateTime对象。所以我猜它没有正确序列化。
“日期”类型没有同样的问题,序列化/反序列化很好。
我注意到了一些问题,但不确定:
生成的类中的dateTime对象如下所示: [System.Xml.Serialization.XmlElementAttribute(ORDER = 10)] public System.DateTime MyDateTime {...}
而生成的类中的日期对象如下所示: [System.Xml.Serialization.XmlElementAttribute(DataType =“date”,Order = 12)] public System.DateTime MyDate {...}
因此,日期对象中有一些额外的信息--DataType =“date”,但dateTime对象没有DateType。这可能是问题吗?如果是这样,为什么不正确生成类?
感谢您的帮助
答案 0 :(得分:4)
我有一个在wsdl中不是必需的dateTime元素,即使我在.NET对象上设置了要发送的属性,它也没有作为XML传递。 (我使用.NET Trace log viewer进行了调试。)
后来我意识到我必须将DateTime属性旁边提供的布尔值设置为true,它会起作用。 xxxSpecified。请参阅下面的代码。
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=6)]
public System.DateTime Created {
get {
return this.createdField;
}
set {
this.createdField = value;
this.RaisePropertyChanged("Created");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool CreatedSpecified {
get {
return this.createdFieldSpecified;
}
set {
this.createdFieldSpecified = value;
this.RaisePropertyChanged("CreatedSpecified");
}
}
答案 1 :(得分:3)
我在JBoss机器上使用Livecycle。我将Web服务从那里连接到.net。我发现DateTime和Booleans没有正确翻译。我知道它不是好形式,但我将serialize数据类型属性设置为字符串。这就是我可以获取数据的方式。
我会查看kroonwijk写的内容。 Fiddler是检查服务来往的好工具。
答案 2 :(得分:2)
我在经过大量努力之前和之后遇到了这个问题我发现通信的一端是使用英国(dd / MM / yyyy)日期格式而另一端是使用美国(MM / dd / yyyy) )格式。这是在机器上的全球化文化中设置的(就像来自@Gaurav的答案)但是,以下情况并不那么明显:
当我在VS下运行我的代码时,我自己运行,因此我自己的en-GB文化。您可能知道,当我在IIS下运行代码时,它在ASPNET帐户(或NETWORK SERVICE等,根据IIS的版本)下运行。事实证明,ASPNET帐户具有en-US文化,因此存在问题。
简单的解决方案是将全球化标记添加到Web.config并设置culture和uiculture属性。
答案 3 :(得分:0)
如果您使用全球化文化信息表示日期时间,则不会出现此类问题。 在你们这两个代码中,你将使用相同的文化信息为date&amp;约会时间。在这种情况下,您在两个代码中都找到了相同的日期时间格式。