在Web服务上查看WDSL。 xml声明数据类型是一个整数,但是,在调用web方法时,该方法需要一个字符串,WDSL代码低于
<System.Xml.Serialization.XmlElementAttribute(Form:=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType:="integer", Order:=0)> _
Public Property ID() As String
Get
Return Me.ID
End Get
Set(value As String)
Me.ID= value
End Set
End Property
这是对的吗?我很困惑,为什么它需要传递一个字符串,如果序列化说的是整数类型?
我的经验告诉我,在他们这边,即服务器,他们会将字符串转换为整数?正确?
由于
答案 0 :(得分:2)
这是一个令人惊讶的好问题,涉及XSD的一些细微之处以及它如何映射到.NET语言,如C#或VB.NET。
WSDL中的XSD类型是xs:integer
类型。 XML Schema规范defines xs:integer as unbounded。这与xs:int, which is bounded to 32 bit形成鲜明对比。
如果你的WSDL改为使用xs:int
,你会发现WSDL导入器将它映射到Int32
。
虽然允许实施对xs:integer
施加限制,例如通过将范围设置为受机器的字大小(can be any size)限制,但"Be liberal in what you accept, and conservative in what you send"是一种好习惯。
由于.NET直到最近才有本地BigInteger类型,因此能够发送或接收xs:intger
的全部值的唯一选择是采用允许无限制的数据类型范围,他们选择string
。我可能更喜欢一种数据类型,它本身仅限于接受数字,但是他们选择了一种核心数据类型的事实可以说明了。
出于不同的原因,它们将类似的方法应用于其他数据类型。例如,gYearMonth
可能已映射到DateTime
类型,在发送时将其他值设置为零。但他们又选择了string
。
以下是Microsoft在导入WSDL时使用的full list of the mappings。
在他们这边即服务器,他们会将字符串转换为整数?正确?
没有。它的工作方式如下(粗略地):