使用列表嵌套WCF数据协定

时间:2014-06-20 14:30:48

标签: vb.net web-services wcf

我按如下方式设置了我的WCF服务:

<ServiceContract()>
Public Interface MyInterface

 <OperationContract()>
 Function Search(ByVal parm1As String, ByVal parm2 As String, ByVal parm3 As String) As MyResponse

End Interface

<DataContract()>
Public Class MyResponse

<DataMember()>
Public Property SearchResult() As SearchRes

<DataMember()>
Public Property RecordInfo() As List(Of RecordInf)

<DataContract()>
Public Class SearchRes
    <DataMember()>
    Public Property Prop1() As String

    <DataMember()>
    Public Property Prop2() As Integer

    <DataMember()>
    Public Property Prop3() As String
End Class

<DataContract()>
Public Class RecordInf
    <DataMember()>
    Public Property Prop4() As String

    <DataMember()>
    Public Property Prop5() As String

    <DataMember()>
    Public Property Prop6() As List(Of MyList)

    <DataMember()>
    Public Property Prop7() As String

    <DataMember()>
    Public Property Prop8() As String

    <DataMember()>
    Public Property Prop9() As String

    <DataMember()>
    Public Property Prop10() As String
End Class

<DataContract()>
Public Class Contr
    <DataMember()>
    Public Property Prop11() As String
End Class

唯一的问题是响应返回如下:

<s:Header />
  <s:Body>
    <SearchResponse xmlns="http://tempuri.org/">
      <SearchResult xmlns:a="http://schemas.datacontract.org/2004/07/MyService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:RecordInfo>
          <a:MyResponse.RecordInf>
            <a:Prop10>Yes</a:Prop10>
            <a:Prop6>
              <a:MyResponse.MyList>
                <a:Prop11>Blah</a:Prop11>
              </a:MyResponse.MyList>
            </a:Prop6>
            <a:Prop5>9780800720957</a:Prop5>
            <a:Prop8>pb</a:Prop8>
            <a:Prop9>9.45</a:Prop9>
            <a:Prop7>Blah</a:Prop7>
            <a:Prop4>Blah</a:Prop4>
          </a:MyResponse.RecordInf>
        </a:RecordInfo>
        <a:SearchResult>
          <a:Prop3 i:nil="true" />
          <a:Prop2>1</a:Prop2>
          <a:Prop1>1</a:Prop1>
        </a:SearchResult>
      </SearchResult>
    </SearchResponse>
  </s:Body>

正如你可以从上面看到的那样:在RecordInfo之后它将类 - a:MyResponse.RecordInf放在我不想要的地方。如何正确设置,以便XML不会嵌套在类名中?

2 个答案:

答案 0 :(得分:0)

您已将RecordInfo声明为RecordInf对象列表,因此列表中可能存在多个对象,而WCF需要打开和关闭标记以区分一个记录与另一个记录。否则,所有记录中的所有属性都将位于相同的标记下。

如果您的RecordInfo总是只包含一条记录 - 用单个RecordInf结构替换列表。

答案 1 :(得分:0)

这是DataContractSerializer对集合类型属性(List是)的默认(和正常)行为。根据文档(MSDN):

  

自定义列表集合中的重复元素名称

     

列表集合包含重复条目。通常,每次重复   条目表示为根据数据命名的元素   集合中包含的类型的合同名称。

     

在CustomerList示例中,集合包含字符串。该   字符串基元类型的数据协定名称是&#34;字符串&#34;,所以   重复元素是&lt;string&gt;

您还可以更改此行为。但是,您必须稍微更改一下DataContract。您必须引入自己的列表类型(Inherits List(Of T)),然后您可以使用CollectionDataContract attribute注释此新列表类型,您可以在其中设置ItemName以控制列表的方式序列

以下列表类定义将为您提供帮助。只需将RecordInfo课程中的MyResponse更改为RecordInfList类型。

<CollectionDataContract(ItemName:="RecordInf")>
Class RecordInfList
    Inherits List(Of RecordInf)
End Class

请注意,以获取文档(MSDN)中的注释:

  

自定义集合类型

     

您可以使用以下方式自定义集合类型   CollectionDataContractAttribute属性,有多种用途。

     

请注意,自定义集合类型会影响集合   可互换性,因此通常建议避免使用   尽可能使用此属性。有关此内容的更多信息   问题,请参阅&#34;高级收集规则&#34;本节稍后部分   主题。