Pregunta

Estoy intentando consumir un servicio de descanso de WCF mediante reflexión, si es posible.Eche un vistazo al código a continuación:

    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 ves es un método genérico que toma T en tiempo de ejecución...Mi problema es que no estoy seguro de poder realmente reflexionar sobre el objeto de canal que estoy creando arriba...Digamos que sí, entonces el problema comienza cuando quiero crear una instancia de objeto...Como no puedo crear una instancia de objeto desde una interfaz...

También me encantaría saber si hay alguna otra forma de lograr esto.Pero prefiero usar el mecanismo de canal si puedo.

¿Fue útil?

Solución

En general, crear una ChannelFactory porque cada operación es costosa.Deberías evitar eso si es posible.El using El patrón también es problemático para ICommunicationObject tipos en WCF, ya que Dispose() generalmente corresponde a Close() que es una llamada de bloqueo/lanzamiento de excepciones.querrás llamar Close() explícitamente en su lugar y manejar TimeoutException y CommunicationException.

Aparte de eso, su enfoque funcionaría.Si utiliza ChannelFactory<T>.CreateChannel, creará un objeto proxy transparente de tipo T que podría invocarse a través de la reflexión si lo desea.Por lo tanto, no tendrá que preocuparse por crear un objeto desde la interfaz del contrato; WCF ya lo hace.

En su ejemplo de código, asegúrese de reemplazar el o con contract y deberías obtener los resultados que esperas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top