2011-11-05 14 views
5

クラスライブラリプロジェクトで次のタイプを定義しました。私のWCFサービス側の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;} 

、私はこのような子メンバ変数として上記のクラスを含むオブジェクトを返しています。

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

クライアント側で参照されているOperationExceptionクラスライブラリがあります。問題は、Add Service Referenceを使用してプロキシを生成するときに、タイプディクショナリのOperationExceptionの新しい定義が生成されることです。 Reuse Typesオプションをtrueに設定しています。このオブジェクトを他のメソッドに渡さなければならないので、実際の '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のツールデザインからそれをチョーク。

関連する問題