2010-03-18 61 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