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 回答