我正在尝试使用 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;