Delphi-PRAXiS

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.

Kostas 30. Mär 2015 16:56

AW: DataSnap von der Session auf den Cannel oder der TCPConnection kommen
 
STOPP hat sich erledigt!!!

Der Hinweis vom Uwe über den TDSSessionManager zu gehen ist richtig.
Ich muss das Session Objekt nicht speichern. Über den Channel hab ich den Zugriff auf die SessionID,
zwar nicht sofort aber das ist für mich völlig ausreichend. Zu dem Zeitpunkt wo ich lesend auf die
Session Infos zugreifen möchte, hatt die Connection längst die SessionID. Somit ist alles in Ordnung
und ich muss das Session Objekt nicht speichern.


Delphi-Quellcode:
TDSSessionManager.Instance.Session[SessionIdList.Items[0]].UserName
Sorry ich hatte einen falschen Gedankengang.
Gruß Kostas


[Edit] DataSnap mit Connection pooling macht jetzt so richtig Laune. :-)
Herzlichen Dank wieder einmal für die großartige Hilfe.

Kostas 31. Mär 2015 11:39

AW: DataSnap von der Session auf den Channel oder der TCPConnection kommen
 
Hallo Zusammen,

ich habe jetzt doch die Anforderung auf die Nutzdaten der drei Objekte TCPConnection, Channel und DSSession
zuzugreifen. Zwar nicht lebenswichtig aber zum logen sehr nützlich. Eine schmutzige Methode wäre sicherlich
nachdem für das erzeugen der Session der Event gefeuert wurde eine thread zu starten der periodisch die
SessionID vom Channel abfragt und sobald sie gesetzt ist, alles ins log zu schreiben.

Ist es in Ordnung wenn ich die Frage nochmals in Embarcadero http://community.embarcadero.com stelle?

Gruß Kostas


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 Uhr.

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