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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top