2012-04-12 10 views
4

Webメソッドで緩やかに型付けされたパラメータが必要です。緩く型付けされたパラメータを持つWCF OperationContract

私は、クライアントがWCF操作に25のDataContractオブジェクトのいずれかを送信できるシナリオを持っています。

proxy1.myFunction(PersonObject) 
proxy1.myFunction(ComputerObject) 

私の制限は、クライアントに公開される操作契約が1つだけであることです。

25個のDataContractクラスのいずれかをパラメータとして使用できるWebメソッドを設計するにはどうすればよいですか?パラメータの型としてobjectを試してみて、DataContractクラスにKnownTypeという属性を与えましたが、シリアル化プロセス中には何もありませんでした。

答えて

8

私はちょうどこれを行った、あなたは、インターフェイスにKnownTypesAttributeを追加する必要があることがわかった。

[ServiceContract] 
[ServiceKnownType(typeof(MyContract1)] 
[ServiceKnownType(typeof(MyContract2)] 
[ServiceKnownType(typeof(MyContract3)] 
public interface IMyService 
{ 
    [OperationContract] 
    object TakeMessage(); 

    [OperationContract] 
    void AddMessage(object contract); 

} 

あなたの実装では、あなたのDataContractsの1つであることを確認する必要があります。

EDIT

あなたが契約の多くを持っている場合は、あなたがKnownTypesにそれらを追加するためにリフレクションを使用することができます。

[ServiceContract] 
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))] 
public interface IMyService 
{ 
    [OperationContract] 
    object TakeMessage(); 

    [OperationContract] 
    void AddMessage(object contract); 
} 

これはそれを行うための非常にクリーンな方法である、と

internal static class KnownTypeHelper 
{ 
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider = null) 
    { 
     var types = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.Namespace == "Company.Path.To.DataContractsNamespace").ToArray(); 

     return types; 
    } 
} 

次に、あなたのインターフェイスを宣言することができます。

+0

ああ!私は...これは私が探していたものです...多くのこのような高速応答のおかげで。 – user1312242

+0

OMG !!素晴らしいです...これはlessと&moreを書くように聞こえますが、私は反射が少しパフォーマンスを低下させることを要求していると思います... – user1312242

1

あなたが試みることができる1つのことは、IObjのようなインターフェイスを作成し、このインターフェイスを25種類のデータコントラクトオブジェクトに実装することです。次に、オペレーション契約の場合、パラメータタイプをIObjとします。これは、25のパラメータで送信するのに役立ちます。

+0

ohhこれはgreateのアイデアです。私には同じことを意味する..しかし、インタフェースIObjには2つの操作があり、すべてのdatacontractクラスでそれらを実装する必要があります。もう一つの懸念事項は次のとおりです:WebMethodがパラメータ型としてIObjを取ったとしましょう...今、WCFクライアントがそのWebメソッドでComputerObjectを送信した後、WCF Sideで型キャストした後、IObj型のオブジェクトを取得できます。私が間違っていると私を修正してください...とにかくletmeしようとする...助けをたくさんありがとう:-) – user1312242

+0

WCF操作契約では、何をすべきかすべてのタイプのオブジェクトをチェックしてキャストします。このようにして、IObjではなくComputerObjectを取得します。しかし、はい、25種類のチェックでは、追加のオーバーヘッドになる可能性があります。 – Krishna

関連する問題