使用Reflection调用WCF函数

时间:2010-03-18 13:43:56

标签: c# wcf reflection

我有一个使用NetTcpBinding的WCF应用程序。我想使用Methodbase.Invoke命名空间中的System.Reflection来调用WCF服务中的函数。换句话说,我希望通过传递String作为函数名来动态调用函数。

Reflection适用于Web Service或Windows应用程序或任何DLL或类。所以肯定有办法为WCF做这个,但我无法找到如何。

我正在获取程序集名称,然后它输入一切正常,但因为我们无法创建Interface类的实例。我试图使用绑定打开WCF连接并尝试传递该对象,但它抛出异常:

“对象与目标类型不匹配。”

我打开了连接并传递了对象,类型只是接口。我不知道我是在尝试错误还是使用错误的方法。知道我怎么能做到这一点吗?

打开连接时,NetTCPBinding所有内容都已正确显示。我使用NETTCPBinding将WCF用作Windows服务。

1 个答案:

答案 0 :(得分:1)

调用方法时传递的是正确的实例。此实例是通过基于接口的ChannelFactory调用创建的代理对象。我在hello world style应用程序上尝试了你的技术并得到了预期的结果。我在代码示例中没有看到的一件事是如何初始化参数。这可能是个问题。我相信你认为你对Type.GetType的调用可能会导致你收到的错误。注意我在Proxy对象上调用了GetType。我在下面包含我的示例代码,它调用一个函数Ge​​tData,它将一个参数作为整数。 ...

 Dim myFactory As ChannelFactory(Of SimpleService.IService1)
    myFactory = New ChannelFactory(Of SimpleService.IService1)(myBinding, myEndpoint)
    oProxy = myFactory.CreateChannel()
    'commented out version that does same call without reflection
    ' oProxy.GetData(3)
   Dim oType As Type = oProxy.GetType
   Dim oMeth As MethodInfo = oType.GetMethod("GetData")
   Dim params() As Object = {3}
   Dim sResults As String
   sResults = oMeth.Invoke(oProxy, BindingFlags.Public Or BindingFlags.InvokeMethod, Nothing, params, System.Globalization.CultureInfo.CurrentCulture)