Пользовательский объект возвращается как «пустой» из WCF? - PullRequest
8 голосов
/ 30 января 2009

По какой (-им) причине (-ам) должен WCF возвращать мне "пустой" экземплярный объект, когда он был явно заполнен при возврате моей службы WCF до того, как он перешел по проводам?

Например, простой OperationContract метод:

response.Client = new Client();
response.Client.ID = 99;
return response;

возвращает «пустой» объект клиента (на стороне получателя клиента), и все поля либо равны нулю, либо равны нулю. Однако непосредственно перед ответом, если я проверяю response.Client.ID, он заполняется 99?

Просто, что еще хуже, у меня есть объект ошибки, и я заполняю его так:

response.Errors.Add(new CodedError(Errors.ErrorCodes.LOGIN_AUTHENTICATION_ERROR));

Однако МОГУ ли я видеть список ошибок на принимающей стороне с этим?

Ответы [ 5 ]

8 голосов
/ 30 января 2009

Если кто-то сталкивается с этой проблемой, я нашел исправление. Из-за бизнес-требований я пометил свой пользовательский класс как [Serializable] и [DataContract], что начиная с .NET 3.5 SP1 может показаться недопустимым, возможно?

У меня есть друг, который отправляет объекты WCF с обоими этими атрибутами до .NET 3.5 SP1, и он работает нормально. Интересно.

К вашему сведению, я просто использовал только [Serializable], и он корректно отправляет мой граф объектов. Мне нужно это для сериализации XML на ходу.

Это была болезненная проблема, но я рада, что теперь она наконец-то работает ...

3 голосов
/ 30 января 2009

Ваш объект помечен как [Сериализуемый] или это [DataContract]? Вам нужно пометить свой объект как один или другой.

WCF знает только, как передавать примитивы или сериализуемые объекты по проводам.

2 голосов
/ 10 февраля 2014

Возможно, уже слишком поздно, но есть простое решение этой конкретной проблемы. По крайней мере, кто-то найдет это полезным.

У меня есть 2 проекта с разными пространствами имен.

  1. MyProject.Business.Entities (помечено [DataContract])
  2. MyProject.Client.Entities (объекты на стороне клиента для представления бизнес-объектов)

Используйте AssemblyInfo.cs и добавьте следующую строку в каждый бизнес-проект и клиентский проект.

[assembly: ContractNamespace("http://www.tempuri.org/MyProject",
                              ClrNamespace = "MyProject.Business.Entities")]

[assembly: ContractNamespace("http://www.tempuri.org/MyProject",
                              ClrNamespace = "MyProject.Client.Entities")]

Кроме того, вы можете сделать это также.

[DataContract (Namespace = "http://www.tempuri.org/MyProject")]
public class Account
{}
2 голосов
/ 30 января 2009

Клиентский прокси обновлен? Я видел, как это происходит, когда меняется контракт, а клиент не обновляется, чтобы отразить это изменение.

1 голос
/ 08 февраля 2012

У меня была такая же проблема. Я изменил пространство имен на объектах на стороне сервера и, хотя я обновил конфигурацию Service Reference, присмотревшись ближе, пространство имен было старым пространством имен, поэтому, хотя скрипач подтвердил, что данные передаются по сети правильно, данные не были переданы на мой клиентский объект. Удаление и повторное добавление ссылки на службу сделали свое дело

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