在 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。前者理解 &lt;DataContract&gt;&lt;DataMember&gt; 等属性(来自 System.Runtime.Serialization 命名空间)。后者理解来自 System.Xml.Serialization 命名空间的属性,例如&lt;XmlElement&gt;&lt;XmlAttribute&gt; 等。当你用&lt;XmlSerializerFormat&gt; 装饰你的合同时,你告诉WCF 使用XmlSerializer,所以它会忽略任何 DCS 特定属性(DCS 是默认属性)。

如果您想在使用XmlSerializer 时更改元素名称,可以使用&lt;XmlElement&gt; 属性:

<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)?

Amazon Web服务Route 53忽略域名

如何获取具有指定名称的 DataMemberAttribute 的属性?

[DataContract]和[DataMember]元素的命名空间

通过 application/x-www-form-urlencoded 反序列化时未使用 WebAPI DataMember 名称