2011-11-05 39 views
5

我已經在類庫項目中定義了以下類型。自定義集合類型不在WCF客戶端上重用代理端問題

[CollectionDataContract()] 
    public class OperationException:System.Collections.Generic.Dictionary<string,ExceptionData> 
    { 
     [DataMember()] 
     public bool ExceptionExists { get; set; } 
    } 

    [DataContract()] 
    public class ExceptionData {[DataMember()] public string Msg;} 

在我的WCF服務結束,我回到它包含了上面的類作爲這樣的孩子成員變量的對象。

[DataContract()] 
public class SaveClient 
{ 
    [DataMember()] 
    public string Id; 
    [DataMember()] 
    public OperationException ExceptionCollection; 
} 

我在客戶端引用了OperationException類庫。問題是當我使用Add Service Reference生成代理時,生成了類型字典的OperationException的新定義。我確實將Reuse Types選項設置爲true。我喜歡使用Actual'OperationException'類型,因爲我必須將此對象傳遞給其他方法。

在此先感謝..!

Iftikhar。

回答

1

您的客戶端代理程序集是否具有添加類型的類庫的項目引用?

如果由svcutil生成的代理不是您想要的,那麼手動編寫它們也很容易。只需創建您自己的ClientBase派生類並在其上實現您的服務接口。然後,您可以控制要重用的組件類型。

+0

是的,我將該引用添加到'OperationException'類庫。我可以嘗試去定製代理路由,但是您是否知道上述代碼中的任何問題可能會導致意外的行爲。 –

3

我有同樣的問題,像你我應用了CollectionDataContract屬性,並告訴代理生成器重用我的共享程序集中的類型。

修復不明顯,您需要在客戶端的Reference.svcmap文件中提供一個鉤子,以告訴生成器使用您的自定義集合類型。

在Reference.svcmap編輯CollectionMappings要素如下,然後更新服務引用:

<CollectionMappings> 
    <CollectionMapping TypeName="YourSharedAssemblyNamespace.OperationException" Category="List" /> 
</CollectionMappings> 

我覺得可以,如果你正在使用命令行SvcUtil工具通過提供集合類型來實現同樣的目標論據。

/collectionType:YourSharedAssemblyNamespace.OperationException 

查看這些信息的詳細信息:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/09eefbbc-bf63-4aa3-a0cb-01a9dbd7f496/

http://www.codeproject.com/KB/WCF/WCFCollectionTypeSharing.aspx

我不知道爲什麼WCF代理生成不只是使用它的常識找到共享集合類型,但你去,把它作爲WCF工具設計的另一個有趣的東西。