2010-02-13 5 views
1

У меня есть класс, как нижеREADONLY поля в WCF

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

Можно ли иметь AmountToPay поле как неизменяемые (как это будет рассчитываться бэкенд), так что клиенты не будут иметь возможность установить его?

Я знаю, что вычисление может переопределить то, что установлено клиентом, но я думаю, что его намного опережает, если клиент не может его установить.

ответ

0

Если клиент не может установить свойство, вы не сможете передать сообщение по проводу. Помните, что клиенту необходимо сериализовать класс, прежде чем передать его на сервер, и если сериализатор не сможет записать это свойство, сервер не сможет его восстановить.

0

Не совсем - могут быть трюки и пути вокруг него, но в основном WCF будет сериализовать ваш вызов в XML-сообщении и отправить его по кабелю. Вы - , а не, связанный с объектом .NET, на который вы устанавливаете свойства, - вы имеете дело с чем-то, что сериализуется в сообщение, отправляемое по кабелю.

Даже если вы определяете одно поле для чтения только на вашей стороне сервера, когда клиент обнаруживает, что этот сервис создает для него прокси-сервер клиента, на основе обменных метаданных службы (думаю: WSDL и XSD) как видимость (private, internal и т. д.), так и методы get/set игнорируются, поскольку они являются только конструктивными конструкциями .NET. Они не отображаются как таковые в WSDL/XSD и поэтому не могут быть воссозданы на стороне клиента.

WCF svcutil создаст клиентскую копию вашего класса контракта данных, но он создаст стандартный класс со всеми свойствами чтения/записи.

Смежные вопросы