WCF дросселирует свойства без "набора". Любое обходное решение?

У меня есть класс, который я передаю в результате метода службы, и этот класс имеет свойство get-only:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

Я получаю исключение со стороны службы:

System.Runtime.Serialization.InvalidDataContractException: не установлено метод для свойства "Сообщение" в типе "MyNamespace.ErrorBase".

Я должен иметь это свойство только как getter, я не могу позволить пользователям назначать ему значение. Любое обходное решение, которое я мог бы использовать? Или мне не хватает дополнительного атрибута?

Ответ 1

Дайте сообщение публичному получателю, но защищенному сеттеру, так что только подклассы (и DataContractSerializer, потому что он обманывает:), могут изменять значение.

Ответ 2

Даже если вам не нужно обновлять значение, setter используется WCFSerializer для десериализации объекта (и переопределения значения).

Это то, что вам нужно: WCF DataContracts

Ответ 3

[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}

Ответ 4

Если у вас есть только получатель, зачем вам вообще сериализовать свойство. Похоже, вы можете удалить атрибут DataMember для свойства только для чтения, и сериализатор просто проигнорирует свойство.

Ответ 5

Не могли бы вы просто настроить "do-nothing"?

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

Или также делает сериализатор DataContract barf тоже?

Ответ 6

Свойства с атрибутом DataMember всегда требуют набора. Вы должны переписать simmilar-объект в клиентское приложение, так как членам DataContract всегда могут присваиваться значения.

Ответ 7

У меня была эта проблема с ASP.NET MVC, и я хотел использовать DataContractSerializer, чтобы иметь возможность управлять именами элементов на выходе JSON. В конце концов я переключил сериализатор на JSON.NET, который поддерживает свойства без сеттеров (без DataContractSerializer) и управления именем свойства (который встроенный JSON-сериализатор в ASP.NET MVC не) через [JsonProperty(PropertyName = "myName")].

Ответ 8

Если это жизнеспособный вариант, то вместо ErrorBase в качестве базового класса определите его следующим образом:

    public interface IError
    {
        string Message
        {
            [OperationContract]
            get;

            // leave unattributed
            set;
        }
    }

Теперь, несмотря на то, что сеттер существует, он недоступен клиенту через канал WCF, поэтому он как бы закрытый.