【问题标题】:Supply a different namespace for a DataMember in a WCF DataContract为 WCF DataContract 中的 DataMember 提供不同的命名空间
【发布时间】:2014-06-26 00:03:57
【问题描述】:

这是我的数据数据合同之一的 VB 类示例:

<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"), _
 System.SerializableAttribute(), _
 System.Diagnostics.DebuggerStepThroughAttribute(), _
 System.ComponentModel.DesignerCategoryAttribute("code"), _
 System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://www.example.com/NS1"), _
 System.Runtime.Serialization.DataContractAttribute([Namespace]:="http://www.example.com/NS1")> _
Partial Public Class SomeType
    ...
    Private someMemberField As String
    ... 

    <DataMember(Order:=4)> _
    Public Property SomeMember() As String
        Get
            Return Me.someMemberField
        End Get
        Set(value As String)
            Me.someMemberField = value
        End Set
    End Property
End Class

WSDL 变为(命名空间为 http://www.example.com/NS1 符合预期):

<xs:complexType name="SomeType">
  <xs:sequence>
    ...
    <xs:element minOccurs="0" name="SomeMember" nillable="true" type="xs:string"/>
    ...
  </xs:sequence>
</xs:complexType>

一个 XML 示例是:

<SomeType xmlns="htttp://www.example.com/NS1">
   ...
   <SomeMember>some text</SomeMember>
   ...
</Sometype>

这对我来说是完美的。但是,我的客户端(不是 WCF)需要为 DataMember 使用不同的命名空间。像这样的 XML 示例:

<SomeType xmlns="http://www.example.com/NS1">
   ...
   <SomeMember xmlns="http://www.example.com/NS2">some text</SomeMember>
   ...
</Sometype>

我认为 WSDL 应该类似于:

<xs:complexType name="SomeType">
  <xs:sequence>
    ...
    <xs:element minOccurs="0" name="SomeMember" nillable="true" type="xs:string" xmlns:q1="http://www.example.com/NS2"/>
    ...
  </xs:sequence>
</xs:complexType>

我知道如何处理复杂的数据类型。

我所要做的就是更改相应类的 DataContractAttribute 中的命名空间,这是我为非原始数据类型的成员所做的。

这对于 String 等原始数据类型是否可行?

我无法更改 DataMembers 中的命名空间,也想不出任何其他方式为原始数据类型设置不同的命名空间。

但是,从 XSD 生成的 XML 示例确实在原始数据类型成员中包含命名空间。

有谁知道我怎样才能使用 WCF 获得这样的东西?

<SomeType xmlns="http://www.example.com/NS1">
   ...
   <SomeMember xmlns="http://www.example.com/NS2">some text</SomeMember>
   ...
</Sometype>

提前致谢,

费尔南多·马丁斯。

【问题讨论】:

    标签: xml wcf namespaces wsdl


    【解决方案1】:

    找到解决方案!

    使用这样的服务合同:

    <ServiceContract(Namespace:="http://www.example.com/NS1")>
    Public Interface MyServiceContract
        ... 
    End Interface
    

    SomeType 类的 XML 如下所示:

    <SomeType xmlns="htttp://www.example.com/NS1">
       ...
       <SomeMember>some text</SomeMember>
       ...
    </Sometype>
    

    将 XmlSerializerFormat() 添加到服务合同中:

    <ServiceContract(Namespace:="http://www.example.com/NS1")>
    <XmlSerializerFormat()>
    Public Interface MyServiceContract
        ... 
    End Interface
    

    XML 变成这样(为每个成员显示命名空间):

    <SomeType>
       ...
       <SomeMember xmlns="htttp://www.example.com/NS1">some text</SomeMember>
       ...
    </Sometype>
    

    然后,第三方客户端为 SomeType 分配封装 SomeType 的相同命名空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2011-11-16
      • 2012-09-01
      • 2021-06-27
      相关资源
      最近更新 更多