Consumindo .net serviço WCF resto através da reflexão
-
06-07-2019 - |
Pergunta
Eu estou tentando consumir um serviço resto WCF através de reflexão, se possível. Dê uma olhada no código abaixo:
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;
}
Como você vê, é um método genérico que leva T em tempo de execução ... o meu problema é que eu não tenho certeza se eu posso realmente refletir sobre o objeto canal Estou criando acima .... Vamos dizer que eu faço, em seguida, os começos de problemas quando eu quero criar uma instância de objeto ... Já que não posso criar uma instância de objeto de uma interface ...
Eu também ficaria feliz em ouvir sobre se há alguma outra maneira de conseguir isso? Mas eu prefiro mecanismo canal de uso, se eu puder.
Solução
Em geral, a criação de um ChannelFactory
para cada operação é caro. Você deve evitar que se possível. O padrão using
também é problemática para tipos ICommunicationObject
em WCF, desde Dispose()
geralmente corresponde a Close()
que é uma chamada de bloqueio /-jogando excepção. Você vai querer chamar Close()
explicitamente vez e TimeoutException
alça e CommunicationException
.
Além de que, a sua abordagem iria funcionar. Se você usar ChannelFactory<T>.CreateChannel
, ele irá criar um objeto proxy transparente do tipo T
o que poderia ser chamado através da reflexão, se quiser. Então você não terá que se preocupar em criar um objeto a partir da interface de contrato -. WCF já faz isso
Em seu exemplo de código, certifique-se de substituir o o
com contract
e você deve obter os resultados esperados.