Свойство имени DataMember игнорируется в веб-сервисе

В моем проекте у меня есть модель представления City, которую предоставляет 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.

Что мне не хватает?

ОБНОВЛЕНИЕ
Я обнаружил, что когда я удаляю параметр XmlSerializerFormat(Style:=OperationFormatStyle.Rpc) в ServiceContract, атрибут datamember используется правильно. Я думаю, что в RPC XmlSerializer может быть ошибка?


person Boris Callens    schedule 04.01.2012    source источник


Ответы (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
person carlosfigueira    schedule 04.01.2012