WCF窒息属性没有“设置”。 任何解决方法?

我有一些我通过服务方法传递的类,并且该类具有只读属性:

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

我在服务方面得到一个例外:

System.Runtime.Serialization.InvalidDataContractException:types为“MyNamespace.ErrorBase”的属性“Message”没有设置方法。

我必须把这个属性当作getter,我不能让用户给它赋值。 任何解决方法,我可以使用? 还是我缺less一些额外的属性?

给消息一个公共getter但受保护的setter,以便只有子类(和DataContractSerializer,因为它作弊:)可能会修改该值。

即使您不需要更新该值,该设置器也会被WCFSerializer用于反序列化对象(并重新设置该值)。

这就是你所追求的: WCF DataContracts

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

如果你只有一个getter,你为什么需要序列化财产。 看来你可以删除只读属性的DataMember属性,并且序列化程序只会忽略该属性。

难道你不能只有一个“不做”的二传手?

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

还是DataContract序列化器barf呢?

具有DataMember属性的属性始终需要设置。 您应该在客户端应用程序上重新编写simmilar对象,因为DataContract成员始终可以分配值。

我有ASP.NET MVC的这个问题,我想要使用DataContractSerializer,以便能够控制JSON输出项目的名称。 最后,我将序列化程序切换到JSON.NET,它支持没有setter(DataContractSerializer没有)和属性名称控制(ASP.NET MVC内置的JSON序列化程序没有)的[JsonProperty(PropertyName = "myName")]

如果它是一个可行的选项,那么不是以ErrorBase作为基类,而是将其定义如下:

  public interface IError { string Message { [OperationContract] get; // leave unattributed set; } } 

现在,即使存在setter,通过WCF通道客户端也无法访问,所以就好像它是私有的。