2010-11-19 10 views
2

In einer typischen Client-Dienstanwendung, in der der Dienst WCF ist, wie können Sie die Dienstreferenz verwenden?WCF-Client - Wann sollte der Client den Kanal schließen?

Zum Beispiel instanziieren Sie Service für jeden Anruf separat, oder öffnen Sie einen Service und halten ihn durch die Lebensdauer der Client-App? (wenn ich von "instatiating service" spreche, meine ich instanziate Service-Objekt erstellt von SVUCUTIL)

Für den Moment haben wir eine Service-Instanz auf Client verwendet, weil das schien schneller als immer erstellen, Öffnen und Schließen des Dienstes für jeden und jeden Anruf, aber jetzt wander ich, wenn das in Ordnung war? Das Hauptproblem, das wir mit diesem Ansatz haben, ist, dass Zeitüberschreitungen auftreten (oder wir müssen Sitzungen für 10 Stunden geöffnet haben), Verbindungsunterbrechungen usw., und wir müssen immer 'IsAlive' durch den Kanal tun, um sicherzustellen, dass alles in Ordnung ist ...

Wenn es von Bedeutung ist, ist die App single-threaded, und die Authentifizierung ist benutzerdefiniert (durch Einfügen von Auth-Token in den Header). Die Bindung ist basicHttp (oder ws, spielt in diesem Fall keine Rolle).

Antwort

1

Persönlich bevorzuge ich es, den Kanal offen zu lassen, bis der Methodenaufruf zurückkehrt, und schließe ihn dann, um Ressourcen freizugeben. Es ist der sauberste Ansatz von allen. Das Initialisieren der Proxy-Instanz ist jedes Mal eine Angelegenheit von Millisekunden und hat nie meine Leistungsziele beeinflusst.

Eine Art von ServiceClient Singleton ist eine interessante Idee, aber wie Sie sagten, es kommt mit einer Menge Nebenwirkungen, ich bin mir nicht sicher, dass das ein kluger Ansatz ist, aber da Ihre App single-threaded ist, dann sollte es nicht ein großes Problem sein und Sie werden wahrscheinlich einige kleine Leistungsvorteile haben.

Wenn das Speichern von Millisekunden geschäftskritisch ist, können Sie auch einen Pool von ServiceClients verwenden, von denen Sie Instanzen abrufen können.

Der erste Ansatz ist jedoch der sauberste. Komplexität ist schlecht.

+0

Und wie gehen Sie mit Sicherheit um? Wir authentifizieren uns vor dem Öffnen eines Kanals ... oder betrachten Sie nur die Serviceaufrufe in Ihrem Netzwerk als sicher, ohne sich zu authentifizieren? – veljkoz

+0

Wie veljkoz sagte, wenn Sie den gesicherten Kanal haben, dann ist jede Client-Proxy-Initialisierung sehr schwer. Wenn Sie mehrere Methoden aufrufen, wird die Leistung beeinträchtigt. – Artru