WCF中的只读字段

时间:2010-02-13 09:21:01

标签: .net

我有一个类似下面的课程

[DataContract]
public class Order
{
   [DataMember]
   int orderId
   [DataMember]
   string ProductCode
   [DataMember]
   Double Quantity
   [DataMember]
   Decimal AmountToPay 
}

是否可以将AmountToPay字段设置为readOnly(因为它将在后端计算),以便客户端无法设置它?

我知道计算可以覆盖客户端设置的内容,但如果客户端无法设置它,我认为它更整洁。

3 个答案:

答案 0 :(得分:1)

您可以将服务器模型放入单独的NuGet程序包(或程序集)中,并与客户端共享该程序包(或程序集)。

请注意,您的模型必须具有专用设置器才能进行序列化和反序列化。

类似的东西:

[DataContract]
public class Order
{
   [DataMember]
   public int orderId { get; private set; }
   ...
}

然后,客户端将添加您的包并选择“在引用的程序集中重用类型”。参见Configure Service Reference dialog box

答案 1 :(得分:0)

如果客户端无法设置该属性,您将无法通过网络传输消息。请记住,客户端需要在将类传递给服务器之前对其进行序列化,如果序列化程序无法写入此属性,则服务器将无法重新构建它。

答案 2 :(得分:0)

不是真的 - 可能存在技巧和方法,但基本上,WCF会将您的调用序列化为基于XML的消息,并通过网络发送。你是处理你正在设置属性的.NET对象 - 你正在处理被序列化为要通过网络发送的消息的东西。

即使您在服务器端将一个字段定义为只读,当客户端检测到该服务根据交换的服务元数据(思考:WSDL和XSD)为其创建客户端代理时,可见性(私有,内部等)以及get / set方法被忽略,因为它们只是.NET相关的结构。它们不会在WSDL / XSD中显示,因此无法在客户端重新创建。

WCF svcutil将创建数据协定类的客户端副本,但它将创建一个包含所有读/写属性的标准类。