2009-10-24 7 views
1

J'essaie de consommer un service de repos wcf par réflexion si possible. Jetez un oeil sur le code ci-dessous:Consommation .net wcf service de repos par réflexion

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 est une méthode générique qui prend T au moment de l'exécution ... mon problème est, je ne sais pas si je peux vraiment réfléchir sur l'objet de canal I Je crée ci-dessus .... Disons que je fais, alors le problème commence quand je veux créer une instance d'objet ... Depuis je ne peux pas créer une instance d'objet à partir d'une interface ...

Je voudrais aussi être heureux d'entendre s'il existe un autre moyen d'accomplir cela? Mais je préfère utiliser le mécanisme de canal si je peux.

Répondre

2

En général, créer un ChannelFactory pour chaque opération est coûteux. 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 de blocage/lancement d'exception. Vous devrez appeler Close() explicitement à la place et gérer TimeoutException et CommunicationException. En plus de cela, votre approche fonctionnerait. Si vous utilisez ChannelFactory<T>.CreateChannel, il va créer un objet proxy transparent de type T qui pourrait être appelé via la réflexion si vous le souhaitez. Vous n'aurez donc pas à vous soucier de créer un objet à partir de l'interface de contrat - WCF le fait déjà.

Dans votre exemple de code, veillez à remplacer le o par contract et vous devriez obtenir les résultats attendus.

+0

Ive essayé votre approche, mais maintenant j'obtiens l'erreur System.Reflection.TargetInvocationException: Exception a été levée par la cible d'un appel. ---> System.InvalidOperationException: L'adressage manuel est activé sur cette usine, donc tous les messages envoyés doivent être pré-adressés. – theKing

+0

Je pense que vous devez ajouter le WebHttpBehavior à votre usine: factory.Endpoint.Behaviors.Add (new WebHttpBehavior()); – bobbymcr

+0

Yess !!, merci travaux. merci beaucoup – theKing

Questions connexes