![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: DataSnap
DataSnap von der Session auf den Channel oder der TCPConnection kommen
Hallo Zusammen,
sobald ein User sich mit dem DataSnap Server verbindet, wird ein TIdTCPConnection und ein TDSTCPChannel Object angelegt. Ziemlich gleich erzeugt der DataSnapServer ein TDSSession Object. Es wurde ein Event Registriert und somit bekomme ich das mit.
Delphi-Quellcode:
An dieser Stelle habe ich alles was ich benötige.
procedure TfrMain.AddSessionListener;
begin //Add a session listener, which will be notified when a session is created or closed. TDSSessionManager.Instance.AddSessionEvent( procedure(Sender: TObject; const EventType: TDSSessionEventType; const Session: TDSSession) begin //the application is in an invalid or terminating state, so ignore the event. if FConnections = nil then Exit; //update the session Id list box AddOrRemoveSession(Session.SessionName, EventType = SessionCreate); end); end; Jetzt würde ich gerne die drei Objekte TIdTCPConnection, TDSTCPChannel und TDSSession in einer eigenen Klasse verwalten. Ich habe keine Möglichkeit gefunden wie ich vom TDSSession Object auf eines der beiden Objekte kommen könnte. Hat jemand eine Idee? Gruß Kostas |
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
Wenn du alle drei Instanzen hast, dann pack die doch in eine Klasse und merk dir die in einem Dictionary wo die Session der Key ist
|
AW: DataSnap von der Session auf den Channel oder der TCPConnection kommen
Hallo,
genau das habe ich vor. Das Problem ist, der Event für eine neue Session wird irgend wann gefeuert und ich finde keine Referenz zu dem Channel oder der Connection. Wenn der Event feuert weis ich nicht zu welcher Connection oder Channel dieser gehört. Sicherlich ist die Session mit der Connection verbunden do genau das ist die Frage, wie komme ich zur Connection oder dem Channel? Gruß Kostas |
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
Ich vermute mal, du hast irgendwo eine TDSTCPServerTransport-Instanz, die für die TCP-Kommunikation zuständig ist. Diese hat wiederum ein OnConnect und ein OnDisconnect.
Beim OnConnect hat der Event-Parameter sowohl den Channel als auch die Connection (allerdings nur als TObject). Über den Channel bekommst du die SessionId, mit der du den SessionManager nach der Session befragen kannst. Beim OnDisconnect bekommst du im Event-Parameter allerdings nur noch die Connection, aber dann ist der Channel wohl eh schon zu. Insofern ist das Abspeichern dieser Instanzen auch nicht ganz ungefährlich. |
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
Hallo Uwe,
zum Zeitpunkt an dem der DSTCPServerTransport1ConnectEvent gefeuert wird, ist die Session ID leer. An dieser Stelle schnappe ich mir die TCPConnection und den Channel, aber wie gesagt die SessionID ist zu diesem Zeitpunkt noch nicht bekannt. Sie wird etwas später erzeugt. Danach kann ich durchaus über den Channel die SessionID abrufen. Wenn der Event für die Session gefeuer wird, würde ich gerne in Erfahrung bringen zu welchem Channel oder Connection die Session gehört damit ich die SessionID zuordnen kann. Sicherlich geht es irgendwie. Gruß Kostas |
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
AFAIK läuft doch jede Verbindung in einem eigenen Thread. Somit hätte man die ThreadID um die Informationen zusammenzuführen.
Aber wie Uwe schon sagt, man muss wegen der Referenzen aufpassen |
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
Vielleicht solltest du mal sagen, welche Informationen du genau brauchst. Vielleicht musst du dazu gar nicht die Instanzen speichern.
|
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
Sorry Uwe,
gemein ist, wenn der Event feuert für eine neue Session, ist die Session ID über den Channel nicht erreichbar, eine Sekunde später kann ich über den Channel die SessionID abrufen. Was ich damit erreichen will ist, im Session Object steckt der Username, Zeitpunkt und weitere Infos der sich angemeldet hat. Die hätte ich gerne im Zugriff. Gruß Kostas |
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
Aber das Session-Object hast du doch?
|
AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
Das Session-Objekt kannst du auch jederzeit (zumindest solange sie gültig ist) über
Delphi-Quellcode:
abrufen. Das ist manchmal ganz praktisch, wenn man User-bezogene Daten innerhalb einer ServerMethode verwenden will.
TDSSessionManager.GetThreadSession
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz