为WCF DataContract中的DataMember提供不同的命名空间

时间:2014-06-26 00:03:57

标签: xml wcf namespaces wsdl

这是我的一个数据数据合同的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>

提前致谢,

费尔南多·马丁斯。

1 个答案:

答案 0 :(得分:0)

找到解决方案!

使用这样的服务合同:

<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的相同名称空间。