我正在尝试使用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服务创建一个代理,并执行一个类型。在它上面,我得到一个方法没有发现异常。
然而,当我尝试调用一个类似的方法,所有字符串作为参数时,我可以成功调用该方法。例如,成功调用了以下方法
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;
我找到了解决问题的方法。看起来KeyValuePair是不可序列化的。我用
Dictionary<string, string>
代替
List<KeyValuePair<string,string>>
,它解决了问题。
谢谢