在webservice中忽略DataMember名称属性
问题描述:
在我的项目中,我有一个由wcf公开的视图模型City。
其中一个属性的名称与已经公开的合同规定的名称不同。
所以我增加了数据成员的属性,并将名称设置值,像这样:在webservice中忽略DataMember名称属性
<DataContract(Namespace:=ServiceNamespace)> _
Public Class City
private mySelectedTranslation as String
<DataMember(Name:="CityName")> _
Public Property SelectedTranslation() As String
Get
Return mySelectedTranslation
End Get
Set (ByVal value As String)
mySelectedTranslation = value
End Set
End Property
End Class
在我消费的测试项目中的服务引用似乎并没有挑上的数据成员属性但并接收SelectedTranslation属性,而不是CityName属性。
我错过了什么?
UPDATE
我发现,当我删除的ServiceContract的XmlSerializerFormat(Style:=OperationFormatStyle.Rpc)
设置,数据成员属性被正确使用。我在想RPC XmlSerializer可能会被窃听?
答
在WCF中有两个用于XML的默认序列化程序:DataContractSerializer
(DCS)和XmlSerializer
。前者理解属性,如<DataContract>
和<DataMember>
(来自System.Runtime.Serialization命名空间)。后者理解来自System.Xml.Serialization命名空间的属性,如<XmlElement>
,<XmlAttribute>
等。当您使用<XmlSerializerFormat>
修饰合同时,您告诉WCF使用XmlSerializer
,因此它将忽略任何DCS特定的属性(DCS是默认的)。
如果你想改变元素名称同时使用XmlSerializer
,你可以使用<XmlElement>
属性:
<XmlType(Namespace:=ServiceNamespace)> _
Public Class City
private mySelectedTranslation as String
<XmlElement(ElementName:="CityName")> _
Public Property SelectedTranslation() As String
Get
Return mySelectedTranslation
End Get
Set (ByVal value As String)
mySelectedTranslation = value
End Set
End Property
End Class