/ / WCF-Client-App Persistente Verbindung zu einem Nicht-WCF-Server (DataSnap) - wcf, delphi, delphi-xe2, datasnap, persistente Verbindung

WCF Client App dauerhafte Verbindung zu Nicht-WCF (DataSnap) Server - WCF, Delphi, Delphi-Xe2, Datasnap, Persistent-Verbindung

Was funktioniert

Ich habe eine DataSnap gebaut Internetservice in Delphi-XE2, das die TDSServer und TDSHTTPService Komponenten. Clients verbinden sich mit dem Server (Internetservice) und führen Sie DataSnap-Servermethoden aus, um Daten abzurufen. Der Server verwendet TDSLifeCycle.Session für alle Verbindungen. Ich möchte weiter verwenden Session wenn möglich, weil ich Sitzungsinformationen in Thread-Variablen speichere ...

ich kann Verwenden Sie Internet Explorer, um sich bei und zu authentifizierenDaten vom DataSnap-Server abrufen. Wenn ich den IE 30 Sekunden lang nicht im Leerlauf befinde (oder die Verbindung zum Server getrennt wird), wird dieselbe Verbindung für jede Methodenanfrage erneut verwendet.

ich kann Verwenden Sie eine einfache Delphi-App, die TIdHTTP für die Verbindung zum DataSnap-Server verwendet. Hinzufügen keep-alive zu seinem Request.Connection Eigenschaft macht es verbunden bleiben für immer und das wiederverwenden ein Verbindung für alle Methodenaufrufe.

.

Problem

Ein Drittanbieter-Unternehmen erstellt eine WCF-App für den Zugriff auf den DataSnap-Dienst. Sie können die WCF-App nicht verwenden einziger Verbindung zum Dienst. Die anfängliche Authentifizierungsanforderung und der Aufruf der ersten Methode verwenden dieselbe Verbindung. Nachfolgende Anforderungen erstellen jedoch neue Verbindungen, die beim Ausführen offensichtlich sind netstat auf ihrem Computer und sehen Sie neu etabliertVerbindungen von ihrer App zu meinem Dienst über mehrere Quellports. Neue Verbindungen erstellen neue Threads im DataSnap-Server, die nicht auf die Sitzungsvariablen des authentifizierten Threads zugreifen können.

.

Mögliche Problemumgehung

Ich weiß, dass ich den DataSnap-Server in einen Server ändern kann Invocation Modell, so dass es nicht notwendig ist, zu warten ein persistente Verbindung pro Client und führt dies bei Bedarf aus. Bevor es so war, hielt ich es für klug zu sehen, ob jemand anderes weiß, wie man das Problem löst.

.

Meine Frage

Kann eine WCF-Client-App eineEinzelne beständige Verbindung zu einem Nicht-WCF-Server (DataSnap-Server), den er für alle Methodenaufrufe verwendet, ohne neue Verbindungen herzustellen? Wie wird das gemacht? Ist es so einfach, die richtige [Dekoration] zum C # WCF-Projekt in Visual Studio hinzuzufügen?

Anregungen werden sehr geschätzt!

.

FYI - Ich habe keinen Zugriff auf den Code des Drittanbieters, sodass ich keine Beispiele für den WCF-Code bereitstellen kann.

Antworten:

0 für die Antwort № 1

Ihre Delphi-Anwendung stellt einen stateful-Webdienst (unter Verwendung von Sitzungsvariablen) bereit WCF-Webdienste sind standardmäßig zustandslos, einschließlich WCF-Kunden.

Könnte sein diese Antwort zeigt auf die korrekte Konfiguration (wsHttpBinding und SessionMode des ServiceContract).

Aus der MSDN-Dokumentation:

Zum Beispiel, wenn die SessionMode-Eigenschaft auf festgelegt ist SessionMode.Required und die InstanceContextMode-Eigenschaft ist auf festgelegt PerSession können Clients die gleiche Verbindung wiederholte Anrufe tätigen auf das gleiche Serviceobjekt.

(Hervorhebung von mir)


Da DataSnap jedoch nicht in erster Linie entworfen wurdeFür die Interoperabilität mit WCF ist es möglicherweise einfacher, die Delphi-Seite so zu gestalten, dass ein zustandsloses Webservice-Modell anstelle von stateful verwendet wird. Dies würde eine Authentifizierung bei jeder Dienstanforderung erfordern, intern könnte der Delphi-Webdienst jedoch einige Cache-Daten enthalten, um die Suchzeiten zu reduzieren, ähnlich dem aktuellen Sitzungsstatus.