2014-11-04 11 views
0

Я пытаюсь написать общий метод, чтобы все методы прокси-сервера wcf проходили этот метод и возвращали значение кэша. Общий метод:Создать динамический делегат WCF TransparentProxy

public T CallService<T>(Delegate del, object[] args) 
{ 
    // begin caching logic 
    // ... 
    // if value is cached, return it. Otherwise call app site.  
    // end caching logic 
    return (T)del.DynamicInvoke(args); 
} 

Для этого мне нужно создать делегат динамически с помощью ссылки ниже.

Creating delegates dynamically with parameter names

Кратко, что я хочу, чтобы создать делегат для метода канала IFooService.Bar (строка парам).

//wcf contract 
public interface IFooService 
{ 
    int Bar(string param); 
} 

//sample proxy 
public class Foo 
{ 
    public int Bar(string param) 
    { 
     IFooService channel = null; 
     int result; 
     try 
     { 
      // we assume that wcf channel has created here 
      ChannelFactory<IFooService> channelFactory = new ChannelFactory<IFooService>(binding, remoteAddress); 
      IFooService channel = channelFactory.CreateChannel(); 

      var parameters = MethodBase.GetCurrentMethod().GetParameters(); 
      object[] args = new object[parameters.Length]; 
      args[0] = param;   

      MethodInfo method = typeof(IFooService).GetMethod("Bar"); 
      Delegate del = CreateDelegate(channel, method); 

      result = CallService<int>(del, args); 
      ((ICommunicationObject)channel).Close(); 
     } 
     catch (Exception ex) 
     { 
      ((ICommunicationObject)channel).Abort(); 
      throw; 
     } 
     return result; 
    } 
} 

При запуске приложения, я получаю исключение в строке «Делегат дель = CreateDelegate (канал, метод)».

Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type. 
     at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure) 

Я считаю, что подпись метода правильная.

Точный тип объекта канала - System.Runtime.Remoting.Proxies .__ TransparentProxy. Однако channel.getType() возвращает IFooService. Как это может быть возможно? Какова магия этой ситуации? Интересно, что шаблон предоставляет это решение и как работает __TransparentProxy. Есть ли образец кода (проекта), демонстрирующий эту архитектуру? Я думаю, поэтому динамическое создание делегата не могло привязать целевой метод.

+0

Я застрял в той же точке – Gandarez

ответ

1

я получил то же самое исключение, когда я попытался

MethodInfo mi = typeof(IMyInterf).GetMethod(MyMethod); 
Delegate d = Delegate.CreateDelegate(typeof(myMethodDelegate), channel, mi); 
d.DynamicInvoke(args); 

Это работает, когда я изменить это:

Delegate d = Delegate.CreateDelegate(typeof(myMethodDelegateX), null, mi); 
d.DynamicInvoke(channel, args); 

Если myMethodDelegate выглядит

delegate void myMethodDelegate(T1 arg1, T2 arg2, ...); 

тогда myMethodDelegateX должны иметь экземпляр, для которого вы передаете канал в качестве первого аргумента, за которым следует фактический аргумент метода с, в зависимости от вызова .DynamicInvoke:

delegate void myMethodDelegateX(IMyInterf targetInstance, T1 arg1, T2 arg2, ...); 

Я нашел этот вариант в документации MSDN на Delegate.CreateDelegate (тип, объект, MethodInfo) перегрузки, это называется «открытый экземпляр» метод там, и он работает с моим каналом WCF, где я всегда получал «не могу привязываться к целевому методу ...»

EDIT: Конечно d.DynamicInvoke (channel, args) - это нонсенс, вы должны поместить эти аргументы в новый массив ,

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

  • Нет связанных вопросов^_^