Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DataSnap von der Session auf den Channel oder der TCPConnection kommen (https://www.delphipraxis.net/184481-datasnap-von-der-session-auf-den-channel-oder-der-tcpconnection-kommen.html)

Kostas 30. Mär 2015 15:51

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:
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;
An dieser Stelle habe ich alles was ich benötige.
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

Sir Rufo 30. Mär 2015 15:58

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

Kostas 30. Mär 2015 16:03

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

Uwe Raabe 30. Mär 2015 16:19

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.

Kostas 30. Mär 2015 16:27

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

Sir Rufo 30. Mär 2015 16:33

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

Uwe Raabe 30. Mär 2015 16:39

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.

Kostas 30. Mär 2015 16:44

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

Sir Rufo 30. Mär 2015 16:47

AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
 
Aber das Session-Object hast du doch?

Uwe Raabe 30. Mär 2015 16:54

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:
TDSSessionManager.GetThreadSession
abrufen. Das ist manchmal ganz praktisch, wenn man User-bezogene Daten innerhalb einer ServerMethode verwenden will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz