2010-03-18 63 views
0

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

反射适用于Web服务或Windows应用程序或任何DLL或类。所以肯定有一种方法可以为WCF做到这一点,但我无法知道如何。

我得到程序集名称,然后键入一切正常,但因为我们不能创建一个接口类的实例。我尝试使用绑定打开WCF连接,并尝试传递该对象,但它抛出了一个异常:

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

我打开了连接并传递了对象,类型仅为接口。我不知道我是在尝试错误的东西还是在用错方法。任何想法我可以做到这一点?

NetTCPBinding在打开连接时都正确给出。我使用WCF作为Windows服务使用NETTCPBinding

+0

您如何获得代理? – Timores 2010-03-18 13:48:48

+0

我在应用程序中添加了接口类,所以我使用该接口类来创建通道。 – Jankhana 2010-03-18 13:54:26

+0

请显示代码和配置。 – 2010-03-18 14:15:35

回答

1

当您调用您的方法时,您正在传递正确的实例。这个实例是通过对ChannelFactory的基于接口的调用创建的代理对象。我在一个hello世界风格的应用程序上尝试过你的技术,并获得了预期的结果。我在代码示例中看不到的一件事是如何初始化参数。这可能是一个问题。我相信认为您对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) 
+0

嘿,它工作!这是一个愚蠢的错误。我再次将我的类型转换为完全限定的接口而不是代理。指向我的代理后,它现在正在工作。非常感谢。 – Jankhana 2010-03-19 06:33:57