Sie fragen sich nur, unter welchen Umständen Sie einen Proxy aus einem WCF-Dienst generieren möchten, wenn Sie nur Anrufe über die ChannelFactory aufrufen können?
Auf diese Weise müssen Sie keinen Proxy generieren und müssen sich keine Gedanken über die Neuerstellung eines Proxys machen, wenn der Server aktualisiert wird.
Vielen Dank
wcf
proxy
channelfactory
TheWommies
quelle
quelle
Antworten:
Es gibt drei grundlegende Möglichkeiten, einen WCF-Client zu erstellen:
Lassen Sie Visual Studio Ihren Proxy generieren. Dadurch wird automatisch Code generiert, der durch Lesen der WSDL eine Verbindung zum Dienst herstellt. Wenn sich der Dienst aus irgendeinem Grund ändert, müssen Sie ihn neu generieren. Der große Vorteil davon ist, dass es einfach einzurichten ist - VS hat einen Assistenten und alles ist automatisch. Der Nachteil ist, dass Sie sich darauf verlassen, dass VS die ganze harte Arbeit für Sie erledigt, und dass Sie die Kontrolle verlieren.
Verwendung
ChannelFactory
mit einer bekannten Schnittstelle. Dies setzt voraus, dass Sie über lokale Schnittstellen verfügen, die den Service (den Servicevertrag) beschreiben. Der große Vorteil ist, dass Änderungen viel einfacher verwaltet werden können - Sie müssen Änderungen immer noch neu kompilieren und korrigieren, aber jetzt generieren Sie keinen Code neu, sondern verweisen auf die neuen Schnittstellen. In der Regel wird dies verwendet, wenn Sie sowohl Server als auch Client steuern, da beide für Unit-Tests viel einfacher verspottet werden können. Die Schnittstellen können jedoch für jeden Dienst geschrieben werden, auch für REST-Dienste. Schauen Sie sich diese Twitter-API an .Schreiben Sie Ihren eigenen Proxy - dies ist ziemlich einfach, insbesondere für REST-Services, indem Sie das
HttpClient
oder verwendenWebClient
. Dies gibt Ihnen die feinste Kornkontrolle, jedoch auf Kosten vieler Service-APIs in Strings. Zum Beispiel:var content = new HttpClient().Get("http://yoursite.com/resource/id").Content;
- Wenn sich die Details der API ändern, tritt erst zur Laufzeit ein Fehler auf.Persönlich hat mir Option 1 noch nie gefallen - das Verlassen auf den automatisch generierten Code ist chaotisch und verliert zu viel Kontrolle. Außerdem entstehen häufig Serialisierungsprobleme - ich habe zwei identische Klassen (eine im Servercode, eine automatisch generiert), die aufgeräumt werden können, aber schmerzhaft sind.
Option 2 sollte perfekt sein, aber Kanäle sind etwas zu einschränkend - zum Beispiel verlieren sie den Inhalt von HTTP-Fehlern vollständig . Das heißt, Schnittstellen, die den Dienst beschreiben, sind viel einfacher zu codieren und zu warten.
quelle
Ich verwende ChannelFactory zusammen mit der MetadataResolver.Resolve-Methode. Die Client-Konfiguration ist problematisch, daher erhalte ich meinen ServiceEndpoint vom Server.
Wenn Sie ChannelFactory (Of T) verwenden, ist T entweder der ursprüngliche Vertrag, den Sie aus einer Referenz in Ihrem Projekt oder einer generierten Vertragsinstanz erhalten können. In einigen Projekten habe ich den Code aus einer Servicereferenz generiert, da ich der Vertrags-DLL keinen Verweis hinzufügen konnte. Sie können sogar einen asynchronen Vertrag mit der Servicereferenz erstellen und diese Vertragsschnittstelle mit ChannelFactory verwenden.
Der Hauptpunkt bei der Verwendung von ChannelFactory war für mich, die WCF-Client-Konfigurationsinformationen zu entfernen. Im folgenden Beispielcode sehen Sie, wie Sie einen WCF-Client ohne Konfiguration erreichen.
In meinem letzten Projekt werden die verfügbaren Bindungen überprüft, um net.tcp oder net.pipe zu verwenden, falls verfügbar. Auf diese Weise kann ich die beste verfügbare Bindung für meine Bedürfnisse verwenden. Ich verlasse mich nur auf die Tatsache, dass auf dem Server ein Metadatenendpunkt vorhanden ist.
ich hoffe das hilft
Übrigens geschieht dies mit .NET 3.5. Es funktioniert jedoch auch mit 4.0.
quelle
The main point of using ChannelFactory to get rid of the WCF client config
Nun, um nutzen zu können
ChannelFactory<T>
, müssen Sie bereit sein, Vertragsbaugruppen zwischen dem Service und dem Kunden zu teilen. Wenn dies für Sie in Ordnung ist,ChannelFactory<T>
können Sie Zeit sparen.quelle
Der Proxy erstellt asynchrone Funktionen, für die es nett ist.
quelle
Meine Antwort ist eine Art Zusammenfassung der Antworten von Keith und Andrew Hare .
Wenn Sie den Server nicht steuern, sondern nur über WSDL / URL verfügen, generieren Sie einen Proxy mit Visual Studio oder svcutil. (Beachten Sie, dass Visual Studio manchmal fehlgeschlagen ist, wenn svcutil besser funktioniert.)
Wenn Sie sowohl Server als auch Client steuern, geben Sie Schnittstellen / Verträge frei und rufen Sie ChannelFactory auf
.
quelle
Es ist nicht nur eine Frage der Zeitersparnis. Die Verwendung des von WSDL generierten Proxys ist gefährlich, da Sie die Lösung in einem inkonsistenten Zustand belassen können, wenn Sie vergessen, die Dienstreferenz zu aktualisieren. Alles wird kompiliert, aber der Servicevertrag ist gebrochen. Ich empfehle auf jeden Fall, wann immer möglich eine ChannelFactory zu verwenden, um Ihnen das Leben zu erleichtern.
Eine mögliche Alternative könnte darin bestehen, ein vorgefertigtes Skript zu schreiben, das das Dienstprogramm SVCUtil aufruft, um den Proxy jedes Mal zu erstellen, wenn Sie Ihr Projekt erstellen. Trotzdem ist ChannelFactory viel ordentlicher und eleganter.
quelle