在 Web 服务中忽略 DataMember 名称属性
Posted
技术标签:
【中文标题】在 Web 服务中忽略 DataMember 名称属性【英文标题】:DataMember name property is ignored in webservice 【发布时间】:2012-02-02 08:20:28 【问题描述】:在我的项目中,我有一个由 wcf 公开的视图模型 City。 其中一个属性的名称与已经公开的合同规定的名称不同。 因此我添加了 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 可能有问题?
【问题讨论】:
【参考方案1】: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
【讨论】:
以上是关于在 Web 服务中忽略 DataMember 名称属性的主要内容,如果未能解决你的问题,请参考以下文章
wcf 如何为 SOAP Web 服务设置不可为空的 DataMember
如何使用 DataContractSerializer 忽略属性(无法删除 DataMember)?
如何获取具有指定名称的 DataMemberAttribute 的属性?
[DataContract]和[DataMember]元素的命名空间
通过 application/x-www-form-urlencoded 反序列化时未使用 WebAPI DataMember 名称