Почему указанный атрибут веб-службы DataMember должен быть установлен для int и Data, но не для String - PullRequest
7 голосов
/ 26 июня 2009

Я создал веб-сервис через WCF. Затем я представил его как веб-сервис, чтобы сделать его пригодным для использования с приложением .NET 2.0. Я создал некоторый DataContract с DataMember, который мог бы использоваться для открытого OperationContract.

Я замечаю, что когда я пытаюсь создать DataClass для передачи в веб-сервис, каждый атрибут DataContract теперь имеет атрибут «Указано» для каждого члена.

Например:

[DataContract]
public class Sales
{

  [DataMember]
  public int InvoiceNo;

...
}

Когда я создаю экземпляр Sales в клиенте веб-службы. Я получаю атрибуты с именами InvoiceNo и InvoiceNoSpecified.

Теперь вот мой вопрос: когда атрибут имеет тип string, мне не нужно устанавливать для соответствующего атрибута «Specified» значение true, но когда типом атрибута является int или DateTime, если я не устанавливаю соответствующий Атрибут «Указано» равен true, значение становится нулевым в хосте веб-службы. Есть ли способ избежать установки указанного атрибута? Потому что мне нужно вызывать функции веб-службы во многих местах моего кода. Было бы действительно трудно отследить их всех.

Ответы [ 3 ]

9 голосов
/ 30 июня 2009

Параметры по умолчанию для атрибута DataMember:

bool EmitDefaultValue (default true)
bool IsRequired (default false)

Если свойство, которое вы выставляете, относится к типу значений, отличному от null, вы должны использовать:

[DataMember(IsRequired = true)]
public int InvoiceNo;
3 голосов
/ 26 июня 2009

Вы можете прочитать объяснение здесь .

Цитата из XmlSerializer :

Если схема содержит элемент, который является необязательным (minOccurs = '0'), или если схема включает значение по умолчанию, у вас есть два варианта. Одним из вариантов является использование System.ComponentModel.DefaultValueAttribute указать значение по умолчанию, как показано в следующем коде. Другой вариант это использовать специальный шаблон для создания логическое поле, распознаваемое XmlSerializer, и применить XmlIgnoreAttribute к полю. шаблон создан в виде propertyNameSpecified. Например, если есть поле с именем "MyFirstName" Вы также создали бы поле с именем «MyFirstNameSpecified», который инструктирует XmlSerializer ли генерировать элемент XML с именем «MyFirstName».

Единственный приемлемый для меня обходной путь, к которому я дошел, - это использование XmlSerializer вместо DataContractSerializer с использованием XmlSerializerFormatAttribute .

1 голос
/ 27 июня 2009

Также вы можете использовать [DataMember(isRequired=True)]

...