2012-03-15 2 views
1

Для клиента мы разрабатываем веб-службы WCF. Наши контракты с сообщениями определяются с использованием атрибутов DataContract и DataMember поверх наших классов и их свойств. Атрибут DataMember имеет дополнительные свойства, которые позволяют нам добавлять дополнительные правила. Например, если свойство всегда должно быть доступно, мы используем (IsRequired = true); чтобы указать это. Эти правила проверяются при получении или отправке сообщения.WCF IsRequired Attribute dilemma

[DataContract] 
public class TestClass  
{ 
    [DataMember(IsRequired = true)] 
    public int RequiredValue { get; set; }  
} 

Однако во время нашего теста мы заметили, что он не работает, потому что на клиентской стороне RequiredValueField инициализируется нулем, поэтому с некоторым чтением я нашел это свойство, EmitDefaultValue = ложь, поэтому при использовании обоих, я получить желаемый результат

[DataContract] 
public class TestClass 
{ 
     [DataMember(IsRequired = true, EmitDefaultValue=false)] 
     public int RequiredValue { get; set; } 
} 

но предположим, если какой-то клиент инициализации RequiredValue = 0, а затем вызвать метод сервиса, он дает ошибку снова. Итак, как бесплатные мои APIusers с возможностью, чтобы они могли передавать какую-либо вещь в этом члене, включая ноль, но когда они опускают, тогда только она должна давать ошибку?

ответ

1
  1. Вы не указали, каков ваш «желаемый» результат. Я имею в виду то, чего вы пытаетесь достичь.
  2. Знаете ли вы, что MS не рекомендует устанавливать EmitDefaultValue на false, если это абсолютно необходимо? Прочтите последний раздел от this MSDN page, чтобы узнать причину.
  3. Когда вы установили EmitDefaultValue в false, WSDL, сгенерированный для вашей службы, содержит некоторые аннотации, которые понимаются только WCF. т. е. при этом вы можете ограничить взаимозаменяемость вашего сервиса. Это ваше требование?

Решение вашей проблемы:

Сделайте свой DataMember "RequiredValue" обнуляемого внутр.

[DataMember(IsRequired = true,EmitDefaultValue=false)] 
    public int? RequiredValue { get; set; } 

Поступая таким образом, значение по умолчанию элемента RequiredValue данных будет null, и вы будете в состоянии установить ноль (0) без каких-либо проблем.