我得到了一个wsdl,我必须按照其规格创建一个Web服务。我正在使用Visual Studio2010。此外,还定义了这种复杂类型:
<xsd:complexType name="Person">
<xsd:sequence>
<xsd:element name="surname" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="birthDate" nillable="true" type="xsd:dateTime"/>
</xsd:sequence>
</xsd:complexType>
使用VS,我得到了以下CS(我不记得自己是怎么做到的,但是我遵循了在网络上找到的说明):
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://XXX/Submitter/")]
public partial class Person {
private string surnameField;
private string nameField;
private System.Nullable<System.DateTime> birthDateField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string surname {
get {
return this.surnameField;
}
set {
this.surnameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string name {
get {
return this.nameField;
}
set {
this.nameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
public System.Nullable<System.DateTime> birthDate {
get {
return this.birthDateField;
}
set {
this.birthDateField = value;
}
}
一切都是正确的:它可以编译,运行并给出预期的结果;唯一的问题是,给我wsdl的另一方在调用我的Web服务时希望获得生日日期字段为
2013-02-15T17:28:00+01:00
带有时区信息,而他们收到的结果就像
2015-11-17T18:30:11
没有时区。
我的问题是我有一个DateTime?
类型,那是我从类实例化到我的对象的那个类型。我应该覆盖序列化还是还有另一个最常见的解决方案?谢谢
不幸的是,XSD与.NET在SOAP Web服务中所支持的之间存在很大的不匹配。
.NET对于此类信息只有两种-DateTime
和.NET DateTimeOffset
。从技术上讲,最好将它xs:datetime
映射到DateTimeOffset
,但这不是它的工作方式。而是xs:datetime
映射到DateTime
,并且在很大程度上取决于Kind
该值的属性来确定其序列化方式。
当DateTime.Kind
为时DateTimeKind.Unspecified
,不传递任何偏移量信息。
当DateTime.Kind
是时DateTimeKind.Utc
,则Z
传递,与相同+00:00
。
当DateTime.Kind
是时DateTimeKind.Local
,则传递与给定日期相对应的本地偏移量。
您可以使用来应用一种DateTime.SpecifyKind
,或者如果要在处理过程中转换值,则可以使用.ToUniversalTime()
或.ToLocalTime()
。或者,如果您知道这些值属于特定时区,则可以使用该TimeZoneInfo
对象的转换方法。只要结果种类是除Unspecified
偏移量以外的其他任何内容,都将包含偏移量。
不幸的是,没有选择指定任意偏移量的选项。这将需要DateTimeOffset
类型,SOAP服务不支持该类型。
另外,请考虑一下,该xs:datetime
类型实际上是生日的错误类型。应该使用xs:date
,它只是一个日期,例如"2013-02-15"
。.NET中目前没有支持这种类型的类型,尽管很快就会出现一种类型,如corefxlab包Date
中的System.Time包中那样。这对于此类情况很有用,但是如果我们可以返回并修复SOAP序列化程序以使用它们,则还有待观察。
确实,最好的主意是不要使用XML和SOAP。而是围绕JSON和REST设计Web服务。在这里,您可以完全控制此类事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句