Question

J'essaie de consommer un service de repos wcf via réflexion si possible. Regardez le code ci-dessous:

    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;
    }

Comme vous le voyez, il s’agit d’une méthode générique prenant T au moment de l’exécution ... mon problème est que je ne suis pas sûr de pouvoir vraiment réfléchir à l’objet de canal que je crée ci-dessus ... Disons que je le fais, puis le problème commence lorsque je veux créer une instance d'objet ... Étant donné que je ne peux pas créer d'instance d'objet à partir d'une interface ...

Je serais également heureux d’entendre parler s’il existe un autre moyen de réaliser cela? Mais je préfère utiliser le mécanisme de canal si je peux.

Était-ce utile?

La solution

En général, créer un ChannelFactory pour chaque opération coûte cher. Vous devriez éviter cela si possible. Le modèle using est également problématique pour les types ICommunicationObject dans WCF, car Dispose() correspond généralement à Close() qui est un appel bloquant / lançant une exception. Vous voudrez appeler TimeoutException explicitement à la place et gérer CommunicationException et ChannelFactory<T>.CreateChannel.

En dehors de cela, votre approche fonctionnerait. Si vous utilisez T, un objet proxy transparent de type o pourra être appelé via réflexion si vous le souhaitez. Ainsi, vous n’aurez plus à vous soucier de créer un objet à partir de l’interface du contrat: WCF le fait déjà.

Dans votre exemple de code, veillez à remplacer le contract par <=> et vous obtiendrez les résultats escomptés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top