Ошибка с клиентом WCF при использовании ссылочных типов - PullRequest
0 голосов
/ 23 сентября 2011

Я использую приложение Silverlight, управляемое WCF.Веб-сервисы используют ссылочные типы, такие как StringBuilder.Однако при передаче объекта StringBuilder или DateTime в службу и из нее состояние объекта теряется.Разве невозможно обновить состояние параметра / типа возврата, передаваемого через веб-службу, если да, то чего мне не хватает?

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

myObj //[myObj Is-A StringBuilder / Has-A StringBuilder, or any other 'reference' object type]

referenceObj.MethodAsync(myObj); // pass on to server-ignoring the values for now


server end  : no ref/out and Simple assignment/append of Value of/inside the object. Object state is updated.

//receive in the delegate
.. MethodCompletedEventArgs e){
myObj = e.Result;   // Expect here,the updated value

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

WCF не является удаленным.Он используется только для передачи информации туда и обратно.

Обновление

Вы все еще думаете, что WCF - это замена замены удаленному взаимодействию.

Ссылочные типы не передаются со своими ссылками, как это было в .NET Remoting.Они рассматриваются как типы значений.Объект, полученный от сервера, НЕ является тем же объектом, который существует на сервере.

Следовательно, изменение объекта на стороне клиента не изменит его на стороне сервера.Вам необходимо отправить его обратно и обновить объект на стороне сервера вручную.

1 голос
/ 23 сентября 2011

При прохождении границы сервиса данные по существу копируются. Изменения, сделанные на другом конце, полностью теряются и не возвращаются к вызывающему. Если вы хотите изменения, то либо:

  • вернуть эти значения в ответе
  • (в некоторых случаях) добавляет ref к параметру - механизм может использовать это для передачи данных обратно вызывающей стороне (обратите внимание, что в этом случае swap объект, а не объединить изменения)

(первое из двух легче рассуждать и будет работать более последовательно)

0 голосов
/ 24 сентября 2011

При прохождении границы сервиса данные сериализуются (копируются). Чтобы убедиться, что ваш класс сериализуем, добавьте в него ключевое слово [Serialize]. Если вы используете объект, который нельзя сериализовать, компилятор выдаст ошибку.

Как сказал Марк, WCF не является удаленным. В COM все данные передавались по значению, но чтобы «помочь» разработчикам, он использовал основной механизм возврата, чтобы вернуть значение, а затем создать ссылку на него под прикрытием. Вместо того, чтобы помочь, это вызвало много проблем, которые большинство разработчиков никогда не могли решить. WCF изменил все это, и теперь все передается по значению.

НТН

...