2011-11-02 45 views
0

我有經過來回以下DataContracts WCF服務:WCF的Guid數據成員沒有序列號正確

 
[DataContract] 
public class RequestWrapper 
{ 
    [DataMember] 
    public FooDataContract FooDataContract; 
} 

[DataContract] 
public class ResponseWrapper 
{ 
    [DataMember] 
    public FooDataContract FooDataContract; 
} 

[DataContract] 
public class FooDataContract 
{ 
    public FooDataContract(string data, Guid id) 
    { 
     Data = data; 
     ID = id; 
    } 

    [DataMember] 
    public string Data { get; set; } 

    [DataMember] 
    public Guid ID { get; set; } 
} 

它是通過代理類調用是這樣的:

 
void CallService(string data) 
{ 
    var id = Guid.NewGuid(); 

    var response = proxy.CallService(new RequestWrapper 
    { 
     new FooDataContract(data, id); 
    }); 
} 

這隨後被傳遞(通過服務)通過使用EF的存儲庫到數據庫:

 
public void RepoMethod(FooDataContract foo) 
{ 
    var guid = foo.ID; // - Breakpoint here shows all zeros! 

    efContext.DoSomething(foo.Data, foo.ID); 
} 

以下是服務電話:

 
public ResponseWrapper CallService(RequestWrapper request) 
{ 
    var foo = request.FooDataContract; 
    repository.RepoMethod(foo); 

    var response = new ResponseWrapper{ FooDataContract = foo }; 
    return response; 
} 

這裏的代理:

 
public class Proxy : IMyService 
{ 
    static readonly ChannelFactory<IMyService> channelFactory = 
     new ChannelFactory<IMyService>("IMyService"); 

    ResponseWrapper CallService(RequestWrapper request) 
    { 
     return channelFactory.UseService(s => s.CallService(request)); 
    } 
} 

internal static class UseServiceFunction 
{ 
    internal static R UseService<T, R> 
      (this ChannelFactory<T> channelFactory, Func<T, R> useService) 
    { 
     var service = channelFactory.CreateChannel(); 
     try 
     { 
      R response = useService(service); 
      return response; 
     } 
     finally 
     { 
      var channel = service as ICommunicationObject; 
      try 
      { 
       if (channel.State != CommunicationState.Faulted) channel.Close(); 
      } 
      catch { channel.Abort(); } 
     } 
    } 
} 

我把手錶上的GUID在VS調試器。從客戶端Web應用程序調用服務時,生成的Guid是看似隨機的十六進制字符的有效Guid。太好了,那是工作。

但是,當數據序列化,通過電線,並出現在另一側(在我的存儲庫),Guid全部爲零!

我已經雙倍,三重檢查Guid確實標有[DataMember]屬性。我想知道是否額外的DataContract層(如何使用RequestWrapper數據約定包裝FooDataContract)導致序列化問題?

+0

您可以在您的WCF服務中提供調用repo方法的代碼嗎? – Suhas

回答

0

原來,我的翻譯層沒有更新以在DTO之間進行轉換! Whooooops!

1

我認爲你的問題在於你的DataContract類中的構造函數沒有傳遞給客戶端的代理。 WSDL不會對此有任何瞭解。將您的數據合同視爲僅用於粘貼數據而沒有其他功能的地方。爲了確認,可以查看添加服務引用時在客戶端生成的reference.cs類。

我建議重寫代碼,以便明確設置數據合同中的每個值而不是依賴構造函數。

您也可以編寫一個手動編碼的代理,它具有您想要的任何行爲,然後與客戶端共享該文件。這會起作用,但你會更緊密地將你的客戶連接到你的服務。

+0

這是一個手動編碼的代理。 – Didaxis

+0

你能分享你的代理的相關部分嗎? –

+0

查看上面的修改。 – Didaxis