Свойство имени DataMember игнорируется в веб-сервисе - PullRequest
0 голосов
/ 04 января 2012

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

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

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

1 Ответ

1 голос
/ 04 января 2012

Существует два сериализатора по умолчанию для XML в WCF: 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
...