为什么 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 响应