我有一个类似下面的课程
[DataContract]
public class Order
{
[DataMember]
int orderId
[DataMember]
string ProductCode
[DataMember]
Double Quantity
[DataMember]
Decimal AmountToPay
}
是否可以将AmountToPay字段设置为readOnly(因为它将在后端计算),以便客户端无法设置它?
我知道计算可以覆盖客户端设置的内容,但如果客户端无法设置它,我认为它更整洁。
答案 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
将创建数据协定类的客户端副本,但它将创建一个包含所有读/写属性的标准类。