0

WCF WebサービスのWSDLを使用してプロキシを動的に作成し、そのメソッドを呼び出そうとしています。実行時にプロキシを構築して呼び出そうとしているWCFサービスのメソッドシグネチャは次のとおりです。

(私はこの目的のためにMSDNのDynamicProxyコードを使用しています。これはここにあります

次のコードスニペットを使用して、実行時にwsdlを使用してプロキシを作成します-

    var factory = new DynamicProxyFactory(wsdl);
    var proxy = factory.CreateProxy(contract);
    object value1 = topic;
    object value2 = emailMessage;
    object value3 = messageProperties; //This is of type List<KeyValuepair<string,string>>

     proxy.CallMethod(method, value1, value2, value3);

上記の呼び出しのメソッドには、以下にリストされているシグネチャがあります。

    void ReceiveMessage(string topic, string message, List<KeyValuePair<string, string>> propertyBag);

上記のメソッドを含むWebサービスのプロキシを動的に作成し、その上でtype.InvokeMemberを実行すると、メソッドが見つからないという例外が発生します。

ただし、すべての文字列を引数として同様のメソッドを呼び出そうとすると、メソッドを正常に呼び出すことができます。たとえば、次のメソッドは正常に呼び出されます

    void ReceiveMessage2(string message, string topic, string anything);

InvokeMemberの使用方法は非常に簡単です

    public object CallMethod(string method, params object[] parameters)
    {
        object retval = this.objType.InvokeMember(
            method,
            BindingFlags.InvokeMethod | CommonBindingFlags,
            null /* Binder */,
            this.obj,
            parameters /* args */);

        return retval;
    }

誰かが私が間違っていることを理解するのを手伝ってくれますか?両方の呼び出し(ReceiveMessageとReceiveMessage2)で同じ方法でオブジェクトを渡します。前もって感謝します。これは私を狂わせてきました。

編集:

上記の関数のcommonBindingFlagsは、実際にはこれのラッパーです-

     BindingFlags.Instance | BindingFlags.Public;
4

1 に答える 1

0

問題の解決策を見つけました。KeyValuePair はシリアル化できないようです。使った

    Dictionary<string, string> 

それ以外の

    List<KeyValuePair<string,string>> 

そしてそれは問題を解決しました。

ありがとう

于 2013-03-18T15:37:33.440 に答える