我按如下方式设置了我的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不会嵌套在类名中?
答案 0 :(得分:0)
您已将RecordInfo声明为RecordInf对象列表,因此列表中可能存在多个对象,而WCF需要打开和关闭标记以区分一个记录与另一个记录。否则,所有记录中的所有属性都将位于相同的标记下。
如果您的RecordInfo总是只包含一条记录 - 用单个RecordInf结构替换列表。
答案 1 :(得分:0)
这是DataContractSerializer
对集合类型属性(List
是)的默认(和正常)行为。根据文档(MSDN):
自定义列表集合中的重复元素名称
列表集合包含重复条目。通常,每次重复 条目表示为根据数据命名的元素 集合中包含的类型的合同名称。
在CustomerList示例中,集合包含字符串。该 字符串基元类型的数据协定名称是&#34;字符串&#34;,所以 重复元素是
<string>
。
您还可以更改此行为。但是,您必须稍微更改一下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;本节稍后部分 主题。