WCF IsReference = true сбрасывает значения по умолчанию

#wcf #datacontract

#wcf #datacontract

Вопрос:

У меня есть очень простая служба WCF 4.0, в которой я возвращаю объект сущности POCO, для IsReference которого установлено значение true. Когда я возвращаю объект из своего сервиса, значения примитивных типов (int, double и т.д.) Устанавливаются правильно, а те, на которые есть ссылки, также сериализуются правильно, я проверил, что сериализация происходит правильно, поместив следующий код непосредственно перед оператором return . Я также проверил, что члены правильно помечены [DataMember] и у них есть общедоступные получатели / установщики. Однако, когда вызывающий объект получает объект, для всех примитивных типов устанавливается значение 0, а для типов со ссылками устанавливается значение NULL.

Был бы признателен за любую помощь!

 try
       {
           var stream = new MemoryStream();
           var dataContractSerializer = new DataContractSerializer(onlineSellItemDetail.GetType());

           dataContractSerializer.WriteObject(stream, onlineSellItemDetail);


       }

       catch (Exception ex)
       {
           Console.WriteLine(ex.InnerException.ToString()); 
       }
 

Комментарии:

1. DataContractSerializer конструктор перегружен флагом, который разрешает циклические ссылки, если мы говорим о .NET Framework, а не о SL, возможно, стоит это проверить

Ответ №1:

Это почти всегда происходит потому, что на стороне клиента не был получен XML, пустой XML или несовместимый XML. Иногда это происходит потому, что поток не был сброшен или закрыт должным образом на стороне службы. В других случаях клиентская сторона работает с полностью допустимым XML в своем собственном потоке, но считывает XML, возможно, не начиная с начала потока. Если вы включите трассировку на стороне службы и на стороне клиента, создадите журналы трассировки и проанализируете с помощью SvcTraceViewer и параллельно используете Fiddler для мониторинга проводного трафика как на стороне клиента, так и на стороне службы, я думаю, вы наверняка найдете ответ!