查看网络服务上的 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 。这与 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 直到最近才具有 native 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 协议(protocol)对类型进行序列化
- 数据通过网络发送
- 数据由他们使用的也理解 SOAP 协议(protocol)的任何系统接收
- 根据模式验证数据
- 数据以另一方程序员认为方便的任何类型进行反序列化,具体取决于工具或他们是否手动操作映射。如果他们使用 WCF,这将再次是一个字符串,除非他们更改了默认值。
- 根据业务逻辑(如果有)验证数据
- 执行业务逻辑
- ....一些其他步骤,最后发送 SOAP 响应
关于xml - 为什么微软匹配一个XSD xs :integer to a string when importing WSDL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32518732/