为什么Microsoft在导入WSDL时将XSD xs:integer与字符串匹配?

时间:2015-09-11 08:15:21

标签: xml vb.net wcf xsd wsdl

在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

这是对的吗?我很困惑,为什么它需要传递一个字符串,如果序列化说的是整数类型?

我的经验告诉我,在他们这边,即服务器,他们会将字符串转换为整数?正确?

由于

1 个答案:

答案 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

  

在他们这边即服务器,他们会将字符串转换为整数?正确?

没有。它的工作方式如下(粗略地):

  • 您的数据类型会针对该类型的方面进行验证,这种情况会发生在您身边,因此您将无法发送“john”值
  • 验证后,使用SOAP协议序列化类型
  • 数据通过电汇发送
  • 他们使用的任何理解SOAP协议的系统都会收到数据
  • 数据根据架构验证
  • 根据工具或他们是否手动操作映射,数据在任何类型的程序员发现方便时都会被反序列化。如果他们使用了WCF,那么这将是一个字符串,除非他们更改了默认值。
  • 根据业务逻辑(如果有)
  • 验证数据
  • 执行业务逻辑
  • ....其他一些步骤,最后发送SOAP响应