2012-03-15 102 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返回。