Сервисные значения по умолчанию WCF

У меня есть следующий класс контракта данных для моего Сервиса WCF:

[DataContract(Name = "MyClassDTO")]
public class MyClass
{
    private string name = "Default Name";

    [DataMember]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

То, когда я использую Visual Studio, Добавляют, что Сервисная Ссылочная функция для генерации Сервиса WCF Ссылается на сгенерированный DataContract, выглядит примерно так:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name = "MyClassDTO", Namespace = "xxx")]
[System.SerializableAttribute()]
public partial class MyClassDTO : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
{

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string NameField;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public string Name
    {
        get
        {
            return this.NameField;
        }
        set
        {
            if ((object.ReferenceEquals(this.NameField, value) != true))
            {
                this.NameField = value;
                this.RaisePropertyChanged("Name");
            }
        }
    }
}

Это означает, значение по умолчанию "Имя по умолчанию" теряется, и после поведения происходит:

MyClassDTO mcdto = new MyClassDTO();
serviceClient.DoSomething(mcdto);


[OperationContract]
void DoSomething(MyClass mc){
   mc.Name //<--   == null    but I want it to be "Default Name"
}

Существует ли путь, настраивают контракт данных тот путь, что определенное значение по умолчанию "Имя по умолчанию" не теряется?

дополнительная информация: Я использую сервисную ссылку без повторного использования типов в блоках, на которые ссылаются, например, на стороне клиента класс, MyClassDTO сгенерирован не знающий о серверном классе MyClass

10
задан Fabiano 21 January 2010 в 09:21
поделиться

4 ответа

Единственное возможное (но уродливое и поэтому не очень удовлетворяющее) решение, которое я нашел на данный момент, это использование атрибута OnDeserializing для установки значений по умолчанию в начале десериализации и использование сеттера поля для определения того, должно ли передаваемое значение быть установлено на самом деле.

   [DataContract(Name = "MyClassDTO")]
    public class MyClass
    {
        private string name;

        public MyClass()
        {
            Init();
        }

        [DataMember]
        public string Name
        {
            get{ return name; }
            set
            {
                if (!String.IsNullOrEmpty(value))
                {
                    name = value;
                }
            }
        }

        private void Init()
        {
            name = "Default Name";
        }

        [System.Runtime.Serialization.OnDeserializing]
        private void OnDeserializing(StreamingContext ctx)
        {
            Init();
        }
  }
3
ответ дан 4 December 2019 в 02:26
поделиться

Я не верю, что XML-схема позволяет описать значение по умолчанию элемента. Это означает, что, если клиент вашего обслуживания обеспокоен, там нет значения по умолчанию.

Кроме того, вы ничего не сделали, чтобы сказать WCF, что вы хотите иметь значение по умолчанию, поэтому, даже если бы был способ сообщить о своем намерении клиенту, тот факт, что вы не сообщаете о своем намерении.

2
ответ дан 4 December 2019 в 02:26
поделиться

Хммм... Я думал, что с [DefaultValue(. ...)], что сработало бы, но, видимо, нет; однако, я немного запутался, почему вы получаете null, так как вы не сказали об этом ни о каком значении по умолчанию, я ожидал, что "Default Name" попадет в выходной файл. Если у вас есть код по умолчанию (или ShouldSerialize* / *Specified), то вы можете попробовать:

[DataMember(EmitDefaultValue=true)]
public string Name {
    get { return name; }
    set { name = value; }
}

Но опять же - я не совсем понимаю, почему вы видите null в первую очередь.

Я только что протестировал это с чем-то, основанным на WCF шаблоне в VS2008, и он работает отлично:

using (var client = new Service1Client()) {
    var result = client.GetDataUsingDataContract();
    Console.Write(result.Name); // "Default Name"
}
2
ответ дан 4 December 2019 в 02:26
поделиться

Старая запись, но кому-то она может понадобиться, как и мне;)

if (strlen($str) == 0){
do what ever
}

замените $ str вашей переменной. NULL и «» возвращают 0 при использовании strlen .

-121--652604-
Dim arrText() As String 
Dim lineThreeHundred As String

arrText = File.ReadAllLines("c:\test.txt") 

lineThreeHundred = arrText(299) 

Edit: C # Version

string[] arrText;
string lineThreeHundred;

arrText = File.ReadAllLines("c:\test.txt");
lineThreeHundred = arrText[299];
-121--4121253-

Во время десериализации будет выполнена логика «set» вашего свойства, поэтому вы можете проверить значение NULL и установить значение по умолчанию, которое вы хотите использовать в этот пункт.

1
ответ дан 4 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: