为什么 Microsoft 在导入 WSDL 时将 XSD xs:integer 与字符串匹配?
Why does Microsoft match an XSD xs:integer to a string when importing WSDL?
查看网络服务上的 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
这是正确的吗?我很困惑,如果序列化是说整数类型,为什么它需要传递一个字符串?
我的经验告诉我,在他们这边,即服务器,他们会将字符串转换为整数?正确的?
谢谢
事实证明这是一个非常好的问题,它涉及 XSD 的一些微妙之处以及如何将其映射到 .NET 语言,如 C# 或 VB.NET。
您的 WSDL 中的 XSD 类型是 xs:integer
类型。 XML 架构规范 defines xs:integer as unbounded. This in contrast to xs:int, which is bounded to 32 bit.
如果您的 WSDL 改用 xs:int
,您会发现 WSDL 导入器将其映射到 Int32
。
虽然允许实现对 xs:integer
施加限制,例如通过将范围设置为受机器字长限制(can be any size), it is good practice to "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。
on their side i.e. server, they will cast the string into an integer? correct?
没有。它的工作原理如下(大致):
- 你的数据类型根据类型的方面进行验证,这发生在你这边,所以你将无法发送 "john"
的值
- 验证后,使用 SOAP 协议对类型进行序列化
- 数据通过网络发送
- 数据被他们使用的也理解 SOAP 协议的任何系统接收
- 根据架构验证数据
- 数据以另一方程序员认为方便的任何类型进行反序列化,具体取决于工具或他们是否手动操作映射。如果他们使用 WCF,这将再次是一个字符串,除非他们更改了默认值。
- 根据业务逻辑(如果有)验证数据
- 执行业务逻辑
- .. 一些其他步骤,最后发送 SOAP 响应
查看网络服务上的 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
这是正确的吗?我很困惑,如果序列化是说整数类型,为什么它需要传递一个字符串?
我的经验告诉我,在他们这边,即服务器,他们会将字符串转换为整数?正确的?
谢谢
事实证明这是一个非常好的问题,它涉及 XSD 的一些微妙之处以及如何将其映射到 .NET 语言,如 C# 或 VB.NET。
您的 WSDL 中的 XSD 类型是 xs:integer
类型。 XML 架构规范 defines xs:integer as unbounded. This in contrast to xs:int, which is bounded to 32 bit.
如果您的 WSDL 改用 xs:int
,您会发现 WSDL 导入器将其映射到 Int32
。
虽然允许实现对 xs:integer
施加限制,例如通过将范围设置为受机器字长限制(can be any size), it is good practice to "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。
on their side i.e. server, they will cast the string into an integer? correct?
没有。它的工作原理如下(大致):
- 你的数据类型根据类型的方面进行验证,这发生在你这边,所以你将无法发送 "john" 的值
- 验证后,使用 SOAP 协议对类型进行序列化
- 数据通过网络发送
- 数据被他们使用的也理解 SOAP 协议的任何系统接收
- 根据架构验证数据
- 数据以另一方程序员认为方便的任何类型进行反序列化,具体取决于工具或他们是否手动操作映射。如果他们使用 WCF,这将再次是一个字符串,除非他们更改了默认值。
- 根据业务逻辑(如果有)验证数据
- 执行业务逻辑
- .. 一些其他步骤,最后发送 SOAP 响应