2012-03-15 112 views
0

WCF相当新颖,需要帮助理解序列化无法正常工作的原因。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> 

结果从提琴手

返回
<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> 

为什么设备ID包含0000的(我认为这是一个空GUID),而ID包含正确的GUID;也为什么Info,Line和Info元素包含零值? 的LogDeviceCommunication是使用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 

我相信我做的事情不正确,因此任何帮助赞赏从EF4生成的POCO。

+1

我想你忽略了一些相关的代码。 ChangeTracker如何初始化? (你也可能想用EF4来标记你的问题,以获得EF小组的关注,因为我怀疑他们会有一些指针......) – 2012-03-15 11:20:45

回答

0

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

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

编辑:刚跑过this blog post,显示EF & WCF之间的一些交互。您可能想要查看它是否适用于您的问题。

0

我敢打赌,该模板生成的课程的其他部分包含了您所看到的元素。

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