wcf序列化

时间:2012-03-15 08:11:22

标签: wcf entity-framework xml-serialization

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;
   }

目前我只是将Fiddler作为测试发布以下XML。

<?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),而ID包含正确的Guid;为什么Info,Line和Info元素包含nil值呢? LogDeviceCommunication是使用ADO.NET自我跟踪模板从EF4生成的POCO

简化版

[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 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

当WCF收到您的请求时,其反序列化机制将创建LogDeviceCommunication类型的新实例,以填充其接收的值。似乎您的实例的EF分部类中的代码正在被触发,并且它会导致您在问题中发布的内容。

尝试在AddDeviceCommunicationLog方法的return语句中设置调试器断点,以查看EF&amp; WCF为您反序列化。如果它与您发布的内容一样,那么问题可能是由EF管道代码引起的。此外,您可能希望启用WCF message tracing以查看WCF实际接收和发送的内容。

编辑:跑过this blog post,展示了EF&amp; E之间的一些互动。 WCF。您可能需要查看它是否适用于您的问题。

答案 2 :(得分:0)

我敢打赌,该模板生成的类的其他部分包含您正在看到的元素。

通常,从Web服务返回EF实体(或任何复杂的.NET类型)并不是一个好主意 - 它们会拖延实现依赖性。将一个纯粹的POCO类作为DTO返回。