.net - WCF:公开未设置的只读 DataMember 属性?

标签 .net wcf readonly datacontract datamember

我有一个服务器端类,我通过 [DataContract] 在客户端上提供该类。这个类有一个只读字段,我想通过属性提供该字段。但是,我无法这样做,因为似乎不允许我在没有 get 和 set 的情况下添加 [DataMember] 属性。

那么 - 有没有办法在没有 setter 的情况下拥有 [DataMember] 属性?

[DataContract]
class SomeClass
{
    private readonly int _id; 

    public SomeClass() { .. }

    [DataMember]
    public int Id { get { return _id; } }        

    [DataMember]
    public string SomeString { get; set; }
}

或者解决方案将使用 [DataMember] 作为字段 - (如所示的 here )?也尝试这样做,但它似乎并不关心该字段是只读的..?

编辑:是通过像这样破解它来创建只读属性的唯一方法吗? (不 - 我不想这样做...)

[DataMember]
public int Id
{
    get { return _id; }
    private set { /* NOOP */ }
}

最佳答案

你的“服务器端”类不会对客户端“可用”,真的。

发生的情况是这样的:根据数据契约,客户端将从服务的 XML 模式创建一个新的单独类。它不能使用服务器端类本身!

它将根据 XML 架构定义重新创建一个新类,但该架构不包含任何 .NET 特定内容,例如可见性或访问修饰符 - 毕竟它只是一个 XML 架构。客户端类将以这样的方式创建,即它在线路上具有相同的“足迹” - 例如它基本上序列化为相同的 XML 格式。

无法通过标准的基于 SOAP 的服务“传输”有关该类的 .NET 特定知识 - 毕竟,您传递的只是序列化消息 - 没有课!

检查“SOA 的四个原则”(由 Microsoft 的 Don Box 定义):

  1. 界限明确
  2. 服务是自主的
  3. 服务共享架构和契约,而不是类
  4. 兼容性基于政策

参见第 3 点 - 服务共享架构和契约,共享类 - 您只共享数据契约的接口(interface)和 XML 架构 - 仅此而已 - 没有 .NET 类。

关于.net - WCF:公开未设置的只读 DataMember 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1873741/

相关文章:

.net - 默认情况下如何在IIS 7.5中将新站点设置为.NET 4

c# - 在发生未处理的异常后,我可以将执行返回到失败的方法吗?

wcf - netTcpBinding 最快的安全配置是什么?

Linux目录卡在只读状态

iphone - 在核心数据持久存储中传送静态(只读)数据的正确方法是什么?

c# - 在上一个异步操作完成之前,第二个操作在此上下文中启动

c# - 正则表达式匹配 lookbehind 和 lookahead 命名组

C# 和不可变性和只读字段……谎言?

c# - 将 DateTime 发送到默认序列化的 WCF 服务

f# - 访问外部程序集中结构的公共(public)只读成员