AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi FMX App und TDSRestConnection, was tun, wenn Session abgelaufen ist
Thema durchsuchen
Ansicht
Themen-Optionen

FMX App und TDSRestConnection, was tun, wenn Session abgelaufen ist

Ein Thema von michaelg · begonnen am 19. Jul 2023 · letzter Beitrag vom 19. Jul 2023
Antwort Antwort
michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#1

FMX App und TDSRestConnection, was tun, wenn Session abgelaufen ist

  Alt 19. Jul 2023, 10:33
Moin zusammen,

stellt Euch vor, Ihr öffnet eine App, die sich Daten von einem Datasnapserver holt. Es gibt eine Anmeldung, wenn diese erfolgreich ist, gibts eine Session. Daten werden abgerufen, alles gut. Nun legt Ihr die App in den Hintergrund (Android iPhone, Windows, egal). Später geht Ihr wieder in die App, und fordert erneut Daten an. Mittlerweile ist die Session abgelaufen und es gibt eine Exception

Code:
HTTP/1.1 403 Session has expired:
Die angegebene Sitzung ist abgelaufen, weil sie inaktiv war oder eine ungültige Sitzungs-ID hatte.
Diese Meldung erscheint direkt auf dem Bildschirm. (Um nicht ewig auf das Ablaufen der Session zu warten, kann man auch einfach den Datasnap-Server anhalten und neu starten während auf dem Gerät der Client noch läuft. Dann kommt dieselbe Exception.)

Clientseitig
Ich möchte "PreserveSessionID" nicht auf False setzen, da im Internet steht, das würde den Server stressen für jedes Request eine eigene Session zu erzeugen.

Deshalb dachte ich, ich könnte die Exception abfangen, wenn sie auftritt, mich neu verbinden und das Request erneut aufrufen, so dass der Benutzer nix davon mitbekommt und er das Gefühl hat, er ist immer online.

tDSRestConnection hat aber leider kein "OnError" oder ähnliches. Wie fange ich die Exception ab?

Ich möchte auch nicht in jeder einzelnen Datasnap-ClientMethode machen, ich suche einen allgemeingültigen Weg. Hat jemand einen Codeschnipsel oder einen Hinweis?

Serverseitig
ServersessionTimeout auf 0 zu setzen am Server kann ich auch nicht, da ich nur einen tDSServer benutze und keinen Webdispatcher habe.

Wie ist das mit "Invocation" beim Life-Cycle des DSServers? Ist das zu empfehlen als Alternative zu "Session"?

Viele Grüße
Michael
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.196 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX App und TDSRestConnection, was tun, wenn Session abgelaufen ist

  Alt 19. Jul 2023, 11:05
Erstmal: Wir abeiten eigentlich nicht mit Sessions. (vielleicht hatten wir dafür damals was nicht aktiviert, oder so ... seit der ersten Version des DataSnap)
Jeder Aufruf ist unabhängig. (quasi RESTful)


Hab schon öfters den Server neu gestartet und noch nie diese Meldung gesehn (XE und 11)

Gut, allerdings könnte es sein, dass dieser Fall hier indirekt abgefangen wird.
Wobei ich diesen Fehler auch noch nie innerhalb des Debuggers bemerkt hatte.

Schon wegen der Datenbank-Verbindung gab es schon immer einen Timer, der alle x Zeit prüft, ob die Verbindung noch steht und wenn nicht ein Reconnect versucht durchzuführen.
SELECT true bzw. inzwischen SELECT current_timestamp an die Datenbank und eine einfache Test-Funktion im DataSnap (ReverseString, welche den DemoCode überlebt hatte).

Im Prinzip gibt es "normal" regelmäßig eine Kommunikation und daher ....


An einer Stelle, wo das Programm (eine Form) wochenlang durch läuft und auch mal tagelang nicht benutzt wird, aber dann sofort gehen soll, wenn ...
Dort gibt es zu Beginn (hier das Scannen eines RFID-Tags oder die maneuelle Eingabe) manuell so einen "Test" und wenn es knallt ein reconnect.
Hier zwar nur für die DB, aber für DataSnap wäre es ja ehnlich möglich
Delphi-Quellcode:
try
  DataSnap.Testfunktion;
except
  DataSnap.Dissconnect; // try DataSnap.Dissconnect; except end;
  DataSnap.Connect;
end;

... und danach dann der eigentliche Code
Ansonsten kannst'e es auch einfach direkt
Delphi-Quellcode:
try
  DataSnap.MyFunction;
except
  // nochmal, falls nicht ging
  // hier aber vielleich den Exception-Type/Message prüfen, ob es nicht ein anderer Fehler war .... nicht dass z.B. was doppelt ausgeführt wird
  DataSnap.Dissconnect; // try DataSnap.Dissconnect; except end;
  DataSnap.Connect;
  DataSnap.MyFunction
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Jul 2023 um 11:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.041 Beiträge
 
Delphi 12 Athens
 
#3

AW: FMX App und TDSRestConnection, was tun, wenn Session abgelaufen ist

  Alt 19. Jul 2023, 11:26
Ich kann es leider gerade nicht testen, daher nur unter Vorbehalt und ins Unreine gesprochen: Du könntest im OnBeforeExecute der Connection mit TestConnection die Gültigkeit der Verbindung prüfen. Im Falle einer Exception löscht du einfach die SessionID.

Das das TestConnection aber intern auch ein Execute aufruft, musst du dies im OnBeforeExecute abfangen, z.B. in dem du den Event-Handler temporär auf nil setzt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#4

AW: FMX App und TDSRestConnection, was tun, wenn Session abgelaufen ist

  Alt 19. Jul 2023, 15:06
Danke Euch beiden!

Ich habe es jetzt so gelöst. Vielleicht auch für andere interessant, die das Problem haben. Es funktioniert, auch wenn ich den Datasnapserver zwischendurch neu starte und die App ist noch aktiv.

Code:
procedure TPONClientModule.DSRestConnection1BeforeExecute(Sender: TObject);
begin
  DSRestConnection1.OnBeforeExecute:=nil;

  if DSRestConnection1.SessionID<>'' then begin
    try
      DSRestConnection1.TestConnection([toNoLoginPrompt]);
    except
      DSRestConnection1.SessionID:='';
    end;
  end;

  DSRestConnection1.OnBeforeExecute:=DSRestConnection1BeforeExecute;
end;
Dass ist die SessionID<>'' vorher abprüfe, habe ich gemacht, da der Login-Vorgang sonst nicht korrekt funktioniert. Und so weiß ich, dass ich mich bereits erfolgreich eingeloggt habe, denn sonst hätte ich keine SessionID.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 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