WCF DataContract上的Readonly属性突然在一个客户端上出现异常

WCF DataContract上的Readonly属性突然在一个客户端上出现异常,wcf,properties,readonly,datacontract,Wcf,Properties,Readonly,Datacontract,最近,我们的WCF服务出现了问题。以下是它的设置方式: 该服务具有必要的ServiceContracts和DataContracts 在DataContract中,有一个只读属性(代码见下文) 客户机对服务和数据契约使用相同的DLL(因此没有WSDL) 这是只读属性: Dictionary<string, string> _list; [DataMember] public IDictionary<string, string> Fields { get

最近,我们的WCF服务出现了问题。以下是它的设置方式:

  • 该服务具有必要的ServiceContracts和DataContracts
  • 在DataContract中,有一个只读属性(代码见下文)
  • 客户机对服务和数据契约使用相同的DLL(因此没有WSDL)
这是只读属性:

Dictionary<string, string> _list;

[DataMember]
public IDictionary<string, string> Fields
{
    get
    {
        if (_list == null)
            _list = new Dictionary<string, string>();
        return _list;
    }
}
Dictionary\u列表;
[数据成员]
公共索引字段
{
收到
{
如果(_list==null)
_列表=新字典();
返回列表;
}
}
客户端通过使用
Fields.Add()
方法轻松地“设置”此属性

最近我们遇到了一个例外,字段应该有一个setter。我在其他几个地方读过这篇文章,但奇怪的是:

  • 有一天,它在客户身上运行得很好,而不是前几天
  • 它在其他客户身上运行良好,并且已经运行了大约1-2年

那么为什么会有这种突然的变化呢?可能是另一个.NET Framework(客户端可能在一夜之间更新)?WCF中是否真的不支持只读属性,因为它在其他客户端上似乎工作正常?

我再也没有关于这方面的任何消息,我也不再参与该项目,因此,如果您遇到同样的问题,这里有一些解决此问题的提示:

  • 代码正在模式下运行
  • 安装了错误的.NET Framework版本(.NET 3.0 SP1必需)
  • 不要使用服务引用

显然,在我的案例中,问题在于一个特定的客户。因此,前两个选项是可能的。

您是否有机会使用服务参考?或者您正在客户端中使用数据协定程序集?我记得也有同样的问题。问题是,我相信,客户端只有.NET3.0;如果编写的代码不起作用。序列化程序在.NET 3.0 SP1之后更改为支持只读属性…通常,在DTO中传递任何复杂结构或具有逻辑或行为都不好。一个问题是,如果客户机使用服务引用,这种行为将不会发生在客户机上。有趣的是,这是一个常见的错误。没有服务引用,正如问题中提到的,但可能不够清楚,我编辑了它):客户端使用与服务和数据契约相同的DLL。感谢Extman,我将检查.Net Framework版本。您可以将DataMember属性移到成员变量(_list)中-过去,当我需要只读属性时,这种技术对我很有效。我记得有过类似的问题,解决方案确实是安装.Net 3 SP1