Consommer le service .net wcf rest via réflexion
-
06-07-2019 - |
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.
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.