сериализация wcf - PullRequest
       34

сериализация wcf

0 голосов
/ 15 марта 2012

Совершенно новый для WCF и нуждается в помощи для понимания, почему сериализация не работает правильно.

Определение службы - я просто хочу опубликовать, сериализовать в объект LogDeviceCommunication, а затем просто вернуть объект в качестве простого теста

[OperationContract]
[WebInvoke(UriTemplate = "AddDeviceCommunicationLog", RequestFormat = 
WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, Method = "POST")]
LogDeviceCommunication AddDeviceCommunicationLog(LogDeviceCommunication
deviceCommunicationEntry);

public LogDeviceCommunication AddDeviceCommunicationLog(LogDeviceCommunication 
deviceCommunicationEntry)
   {
   return deviceCommunicationEntry;
   }

В данный момент я просто публикую следующий XML-файл с Fiddler в качестве теста.

<?xml version="1.0" encoding="UTF-8"?>
<LogDeviceCommunication>
   <ID>1207a26e-ab59-4977-b7eb-b2776205cffe</ID>
   <DeviceID>A42E8707-7C65-45AA-8E58-5D21F53DA101</DeviceID>
   <Time>2012-03-14T15:38:28.379Z</Time>
   <Line>0</Line>
   <Tab>0</Tab>
   <Info>Starting Synchronisation</Info>
</LogDeviceCommunication>

Результаты, полученные из Fiddler

<LogDeviceCommunication z:Id="i1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
   <ChangeTracker z:Id="i2"
      xmlns:a="http://schemas.datacontract.org/2004/07/conxEntities">
      <a:ExtendedProperties/>
      <a:ObjectsAddedToCollectionProperties/>
      <a:ObjectsRemovedFromCollectionProperties/>
      <a:OriginalValues/>
      <a:State>Added</a:State>
   </ChangeTracker>
   <DeviceID>00000000-0000-0000-0000-000000000000</DeviceID>
   <ID>1207a26e-ab59-4977-b7eb-b2776205cffe</ID>
   <Info i:nil="true"/>
   <Line i:nil="true"/>
   <Tab i:nil="true"/>
   <Time>2012-03-14T15:38:28.379Z</Time>
</LogDeviceCommunication>

Почему DeviceIDсодержат 0000 (я полагаю, это нулевой Guid), в то время как идентификатор содержит правильный Guid;также, почему элементы Info, Line и Info содержат значения nil?LogDeviceCommunication - это POCO, сгенерированный из EF4 с использованием шаблона самоконтроля ADO.NET

Сжатая версия

[DataContract(IsReference = true, Namespace = "")]

public partial class LogDeviceCommunication: IObjectWithChangeTracker, 
INotifyPropertyChanged
[DataMember]
public System.Guid DeviceID
[DataMember]
public System.DateTime Time
[DataMember]
public Nullable<int> Line
[DataMember]
public Nullable<int> Tab
[DataMember]
public string Info
[DataMember]
public System.Guid ID

Я уверен, что что-то делаю неправильно, поэтому любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 19 марта 2012
0 голосов
/ 15 марта 2012

Бьюсь об заклад, другие части класса, созданные этим шаблоном, включают в себя элементы, которые вы видите.

В общем случае возвращать сущности EF (или любой сложный тип .NET) из веб-службы не рекомендуется - они перетаскивают зависимости реализации.Вместо этого верните класс POCO как DTO.

0 голосов
/ 15 марта 2012

Когда WCF получит ваш запрос, его механизм десериализации создаст новый экземпляр типа LogDeviceCommunication для заполнения полученными значениями.Кажется, что код из частичного класса EF вашего экземпляра запускается, и это приводит к тому, что вы публикуете в своем вопросе.

Попробуйте установить точку останова отладчика в операторе возврата в вашем методе AddDeviceCommunicationLog, чтобыПосмотрите, что EF & WCF десериализовали для вас.Если это именно то, что вы опубликовали, то проблема, вероятно, вызвана каналом EF.Кроме того, вы можете включить трассировку сообщений WCF , чтобы увидеть, что WCF фактически получает и отправляет обратно.

РЕДАКТИРОВАТЬ: просто наткнулся на это сообщение в блоге , которое показываетвзаимодействия между EF и WCF.Возможно, вы захотите просмотреть его, чтобы выяснить, применимо ли оно к вашей проблеме.

...