Der Konsum von .net wcf Rest Service durch Reflexion
-
06-07-2019 - |
Frage
Ich versuche, einen WCF Rest-Service über Reflexion, wenn möglich zu verbrauchen. Werfen Sie einen Blick auf den Code unten:
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;
}
Wie Sie sehen, es ist eine allgemeine Methode, die T zur Laufzeit dauert ... mein Problem ist, ich bin nicht sicher, ob ich wirklich auf dem Kanal Objekt reflektieren kann ich oben bin die Schaffung .... sagen wir ich tun, dann beginnt der Ärger, wenn ich ... eine Objektinstanz erstellen möchten Da ich nicht eine Objektinstanz von einer Schnittstelle erstellen können ...
würde ich auch gerne hören, wenn es eine andere Möglichkeit, dies zu erreichen? Aber ich ziehe Kanal-Mechanismus zu verwenden, wenn ich kann.
Lösung
In der Regel für jeden Betrieb ein ChannelFactory
schaffen, ist teuer. Sie sollen, wenn möglich, vermeiden. Das using
Muster ist auch problematisch für ICommunicationObject
Typen in WCF, da Dispose()
allgemein Close()
entspricht, die ein Sperr / Ausnahmewerfen Anruf. Sie wollen Close()
nennen explizit statt und behandeln TimeoutException
und CommunicationException
.
Abgesehen davon, würde Ihr Ansatz arbeiten. Wenn Sie ChannelFactory<T>.CreateChannel
verwenden, wird es einen transparenten Proxy-Objekt vom Typ T
erstellen, die auf über Reflexion aufgerufen werden können, wenn Sie wollen. Sie werden also nicht über das Erstellen eines Objekts aus dem Vertrag Schnittstelle zu kümmern -. WCF bereits tut, dass
In Ihrem Codebeispiel, stellen Sie sicher, die o
mit contract
zu ersetzen, und Sie sollten die Ergebnisse erhalten, die Sie erwarten.