Visual Studio导入SOAP服务Web Reference:xs:time转Date的问题咨询
解决WSDL中xs:time字段被.NET转换为DateTime类型的问题
我之前也碰到过类似的SOAP服务类型映射坑,给你几个实用的解决方案:
方案1:手动调整自动生成的代理类(临时应急)
直接修改Reference.vb里的XYZ字段类型,把Date改成TimeSpan——这是.NET中对应xs:time的原生类型。不过要注意:每次更新Web引用时,这个文件会被重新生成,你的修改会被覆盖,所以这个方法只适合临时测试,不推荐长期使用。
方案2:利用部分类扩展,自定义序列化逻辑(推荐)
Web引用生成的代理类都是部分类,你可以在同一个命名空间下创建一个新的代码文件,扩展这个类来控制XYZ字段的序列化,完全不用动自动生成的Reference.vb:
Namespace YourWebServiceNamespace Partial Public Class YourServiceClass ' 忽略自动生成的DateTime类型的XYZ属性 <System.Xml.Serialization.XmlIgnore()> Public Shadows Property XYZ As Date ' 新增一个用于序列化的属性,专门处理xs:time格式 <System.Xml.Serialization.XmlElement("XYZ", DataType:="time")> Public Property XYZ_Time As TimeSpan Get Return Me.XYZ.TimeOfDay End Get Set(value As TimeSpan) Me.XYZ = DateTime.Today.Add(value) End Set End Property End Class End Namespace
这样当你给XYZ_Time赋值TimeSpan.FromHours(0)(也就是00:00:00)时,序列化后只会输出纯时间部分,不会带日期和时区信息。
方案3:用svcutil.exe生成代理类时指定类型映射
如果重新生成代理类,你可以用svcutil.exe工具(而不是Visual Studio的添加Web引用功能),通过参数强制把xs:time映射为TimeSpan:
打开命令提示符,运行类似这样的命令:
svcutil.exe /language:vb /out:Reference.vb /serializer:XmlSerializer http://your-service-url?wsdl
默认情况下,XmlSerializer会把xs:time映射为TimeSpan,而不是DateTime。生成后把这个文件添加到项目里替换原来的Web引用即可。
额外提示:如果必须用DateTime类型的临时处理
如果你暂时没法修改类型,初始化的时候可以这样做:
Dim service As New YourWebServiceClient() service.XYZ = New DateTime(1, 1, 1, 0, 0, 0) ' 使用最小日期+目标时间
不过这个方法不一定可靠,因为序列化时可能还是会带上日期部分,最好还是用前面的方案2或3从根源解决。
内容的提问来源于stack exchange,提问作者Stefano
相关产品推荐
相关产品推荐

