2009-04-03 6 views
5

MSDNからServiceKnownTypeの例を​​実装しようとしたときに問題が発生しました。svcutilは、生成されたインターフェイスプロキシからServiceKnownType属性を省略します。

[DataContract()] 
public class Widget 
{ 
    [DataMember] 
    public string Id; 
    [DataMember] 
    public string Catalog; 
} 

[DataContract()] 
public class Machine : Widget 
{ 
    [DataMember] 
    public string Maker; 
} 

そして、次のインターフェイス:

[ServiceKnownType(typeof(Widget))] 
[ServiceKnownType(typeof(Machine))] 
[ServiceContract()] 
public interface ICatalog 
{ 
    [OperationContract] 
    Hashtable GetItems(); 
} 

問題は、プロキシクラスが生成されたとき(「サービス参照の追加」を使用していることである/ svcutil.exe彼らは次のクラスを提供例で )、 "ServiceKnownType"属性はIChalogプロキシインターフェイスから除外され、結果として例外が発生する "メッセージを逆シリアル化しようとしている間にフォーマッタが例外をスローしました:... "ウィジェット "に対応するタイプを既知のタイプのリスト" この問題を解決するには、生成されたプロキシインタフェースに既知のサービス属性を手動で追加する必要があります。これは非常に悪い解決策です。参照を更新するとコードが再生成されるためです。 全てのこのような状況で興味深いのは、すなわち、のgetItems操作ではなく、ハッシュテーブルのオブジェクト、またはパラメータとしてオブジェクトを取得を返す場合は、その問題が解決されることを

[OperationContract] 
object GetItems(); 

または

[OperationContract] 
Hashtable GetItems(object obj); 
です

の結果、ICatalogプロキシインターフェイスに「ServiceKnownType」属性が存在します。 誰もこの問題を解決する方法を知っていますか?

おかげ

答えて

0

は、関連problemしているようです。

ウィジェットの汎用辞書を返して、[KnownType(typeof(Machine))]をウィジェットクラスに入れてみましたか?

+3

実際のシナリオでは、「ウィジェット」クラスに属性を追加できないため、ServiceKnownTypeではなくKnownTypeで動作させたいのですが、それは変更できないDLLにあるためです。私のシナリオでは他のソリューションに感謝しますが、MSDNの例がうまくいかない理由を知りたい – Andy

1

私は今まで何時間も費やしたことは、私が知る限り、まったく同じ問題です。私の解決策は、IDesignのServiceModelExライブラリのAddGenericResolverメソッドを使用することでした。

注:それはあなたがIDesign Downloads page上でそれを見つけることができます

DataContractResolver

を使用して必要な.NET 4.0。

私は私の場合にしなければならなかったすべては、コードの次の行を追加しました:私は、これはそこに他の誰かが数時間を節約することができます願ってい

Client.AddGenericResolver(typeof (K2Source)); 

を!

あなたは本の中でより多くの情報を見つけることができます「プログラミングWCFサービス:マスタリングWCFとAzureのAppFabricのサービスバス」svcutilによって無視ServiceKnownTypeとジュバル・ロウィ

0

問題ではまだここにいます。私のソリューションは、プログラムのクライアント契約の参照に「既知の型」を追加します:

var client = new ServiceReferenceClient("clientEndpoint"); 
foreach (var o in client.Endpoint.Contract.Operations) 
{ 
    o.KnownTypes.Add(typeof(MyType01)); 
    o.KnownTypes.Add(typeof(MyType02)); 
    o.KnownTypes.Add(typeof(MyType03)); 
} 

それは(ハードクライアント側でコード化されなければならない)完璧なソリューションではありませんが、それは私のために動作します。

関連する問題