在我的项目中,我有一个由wcf公开的视图模型城市 其中一个属性的名称与已经暴露的合同所规定的不同 因此,我添加了DataMember属性并设置了Name值,如下所示:
<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
在我的消费测试项目中,服务引用似乎没有获取DataMember属性,但是接收SelectedTranslation属性而不是CityName属性。
我错过了什么?
更新
我发现当我删除ServiceContract的XmlSerializerFormat(Style:=OperationFormatStyle.Rpc)
设置时,正确使用了datamember属性。我认为RPC XmlSerializer可能会被窃听?
答案 0 :(得分:1)
WCF中有两个默认的XML序列化程序:DataContractSerializer
(DCS)和XmlSerializer
。前者理解<DataContract>
和<DataMember>
等属性(来自System.Runtime.Serialization命名空间)。后者理解System.Xml.Serialization命名空间中的属性,例如<XmlElement>
,<XmlAttribute>
等。当您使用<XmlSerializerFormat>
装饰合同时,您告诉WCF使用{ {1}},因此它将忽略任何特定于DCS的属性(DCS是默认值)。
如果您想在使用XmlSerializer
时更改元素名称,可以使用XmlSerializer
属性:
<XmlElement>