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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top