Использование сервиса .net wcf rest с помощью рефлексии
-
06-07-2019 - |
Вопрос
Я пытаюсь использовать службу отдыха wcf через рефлексию, если это возможно. Посмотрите на код ниже:
public static object WCFRestClient<T>(string method, string uri, params object[] args)
{
object o;
object ret;
using (ChannelFactory<T> cf = new ChannelFactory<T>(new WebHttpBinding(), uri))
{
T contract = cf.CreateChannel();
ret = contract.GetType().GetMethod(method).Invoke(o, args);
}
return ret;
}
Как вы видите, это универсальный метод, который принимает T во время выполнения ... моя проблема в том, что я не уверен, смогу ли я действительно отразить объект канала, который я создаю выше .... Допустим, я это делаю, тогда проблема начинается, когда я хочу создать экземпляр объекта ... Так как я не могу создать экземпляр объекта из интерфейса ...
Я также был бы рад услышать о том, есть ли другой способ сделать это? Но я предпочитаю использовать канальный механизм, если смогу.
Решение
Как правило, создание ChannelFactory
для каждой операции стоит дорого. Вам следует избегать этого, если это возможно. Шаблон using
также проблематичен для типов ICommunicationObject
в WCF, поскольку Dispose()
обычно соответствует Close()
, который является вызовом блокировки / исключения. Вместо этого вы захотите явно вызвать TimeoutException
и обработать CommunicationException
и ChannelFactory<T>.CreateChannel
.
Помимо этого, ваш подход будет работать. Если вы используете T
, он создаст прозрачный прокси-объект типа o
, который может быть вызван через отражение, если хотите. Так что вам не придется беспокоиться о создании объекта из интерфейса контракта - WCF уже делает это.
В своем примере кода замените contract
на <=>, и вы получите ожидаемые результаты.