Я пытаюсь написать общий метод, чтобы все методы прокси-сервера 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. Есть ли образец кода (проекта), демонстрирующий эту архитектуру? Я думаю, поэтому динамическое создание делегата не могло привязать целевой метод.
Я застрял в той же точке – Gandarez