2010-03-18 2 views
0

У меня есть приложение WCF, которое использует NetTcpBinding. Я хочу вызвать функции в службе WCF, используя Methodbase.Invoke из пространства имен System.Reflection. Другими словами, я хочу динамически вызвать функцию, передав String в качестве имени функции.Вызов функций WCF с использованием Reflection

Отражение отлично подходит для веб-службы или приложения Windows или любой DLL или класса. Таким образом, для WCF существует определенный способ сделать это, но я не могу узнать, как это сделать.

Я получаю имя сборки, тогда он тип все отлично, но поскольку мы не можем создать экземпляр класса Interface. Я попытался открыть соединение WCF с помощью привязки и попытался передать этот объект, но он выбрал исключение как:

«Объект не соответствует типу цели».

Я открыл соединение и передал объект, и тип имеет только интерфейс. Я не знаю, пытаюсь ли я ошибиться или ошибаюсь. Любая идея, как я могу это сделать?

NetTCPBinding все правильно указаны при открытии соединения. Я использую WCF в качестве службы Windows, используя NETTCPBinding.

+0

Как вы овладеваете прокси-сервером? – Timores

+0

Я добавил класс интерфейса в мое приложение, поэтому я использую этот класс интерфейса для создания канала. – Jankhana

+0

Показать код и конфигурацию, пожалуйста. –

ответ

1

Вы передаете правильный экземпляр при вызове метода. Этот экземпляр является прокси-объектом, созданным с помощью интерфейса на основе ChannelFactory. Я попробовал вашу технику в приложении приветствия мирового стиля и получил ожидаемые результаты. Одна вещь, которую я не вижу в вашем примере кода, - это то, как вы инициализируете параметры. Это может быть проблемой. Я считаю, что ваш вызов Type.GetType может вызвать ошибку, которую вы получаете. Заметьте, что я вызываю GetType на объекте Proxy. Я включаю код примера ниже, который вызывает функцию GetData, которая принимает один аргумент как целое число. ...

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

Смежные вопросы