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 № 1Ihre 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.