xml - 为什么微软匹配一个XSD xs :integer to a string when importing WSDL?

标签 xml vb.net wcf xsd 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 。这与 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/

相关文章:

html - 如何使用 SMTP 发送正文带有图像的电子邮件?

wcf - azure acs中可以同时拥有客户端证书安全和服务身份认证吗

java - 如何从不同的maven项目导入spring资源?

xml - 是否可以像代码中那样对单个标签使用多个标签值

java - org.dom4j.DocumentException : Stream closed Nested exception: Stream closed

c# - 在 Asp.Net MVC 项目中托管 WCF 服务

c# - 序列化对象而不包括属性名称

xml - XSLT:如何选择没有子节点的所有节点

sql - 为什么这个 LINQ Group 通过聚合 vb.net 中的行?

asp.net - 为什么PreInit上的ClientID与Init或PreRender中的ClientID不同?