Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   DataSnap-Client lässt sich nicht erstellen (https://www.delphipraxis.net/206184-datasnap-client-laesst-sich-nicht-erstellen.html)

himitsu 27. Nov 2020 15:49


DataSnap-Client lässt sich nicht erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin Moin,

beim Versuch einen DataSnap-Client neu zu erstellen, gibt es am Ende des Experten einen Fehler und es bricht bei/vor Erstellung der Units ab.
Delphi 10.4.1 (im XE keine Probleme)

TestServer.exe
* compilieren + starten (ohne Debugger)
ClientTCP.exe
* Datei > Neu > DataStnap > DataSnap-Client-Modul
* Lokaler Server
* Eigenständiger DataSnap-Server
* TCP/IP
* Port 211, User/Pass= egal
-> Remote-Fehler: Zugriffsverletzung bei Adresse 00A37818 in Modul 'TestServer.exe'. Lesen von Adresse 00000000

* der DSServer ist wie vom Experten generiert
* nur zusätzlich mit Billig-Logging und den zwei Testfunktionen für TStream.

Der Fehler kommt in der IDE / im Experten (nicht aus in der Server-EXE)
Die Server-EXE erkennt schonmal die Verbindung (LOG: UserAuthenticate Protocol=tcp/ip Context= User=user:pass)

XE: Quellcode und Compilate
104: nur die Quellcodes, da die EXEn das Limit brechen (Allein der Server wird von 3MB wird zu 31MB und selbst Release+komprimiert übertrifft es die 5MB des Forum-Anhangs)

---

Damals im XE, bei den ersten Generationen des DataSnap hatten wir/ich so Einiges am automatisch generierten Code angepasst.
* bei Übertragung von TPgDataSet, während der Übertragung von TEXT in VARCHAR geändert, weil es mit TEXT nicht ging
* bei Übertragung von Streams die übertragenen Streams in einen TMemoryStream umkopiert, weil Komponenten mit dem Stream.Size=-1 (wenn über 32 KB) nicht zurecht kamen
* ...
* ich hoffe das ganze Zeugs für TDataSet-Übertragung ist wieder raus (hatte es entfernt, als wir nach massiven langjährigen Problemen auf Materialized-Views in der Datenbank als PreCache umgestiegen sind)

Bei Umstellung von XE zu 10.2 10.3 10.4 wollte ich mir nun den Server und Client neu erstellen lassen
und dann schauen/vergleichen was nun zu tun wäre.
* die Übertragungsverschlüsselung hatte ich auskommentiert (fand auf die Schnelle irgendwelche Klassen/Units nicht, aber egal, da bisher eh nicht aktiv :oops:)
* und ansonsten ließ sich der alte Code erstmal problemlos kompilieren (nur paar USES anpassen)
* aber im Betrieb raucht dann der DataSnap-Client beim Connect:=True ab
* * Exception weil Interface (GUID irgendwas) nicht registriert sei (war irgendwas aus der IPPeerAPI)

TiGü 27. Nov 2020 16:14

AW: DataSnap-Client lässt sich nicht erstellen
 
Du musst deine Frage noch stellen! :warn:

himitsu 27. Nov 2020 17:01

AW: DataSnap-Client lässt sich nicht erstellen
 
Weiß jemand warum es nicht geht? :angle2:

himitsu 28. Nov 2020 17:27

AW: DataSnap-Client lässt sich nicht erstellen
 
Problem gelöst


OK, es war doch ein Fehler im Server und nicht im Experten. :oops:

Es waren 2-3 Fehler in Logging und Fehlerbehandlung.
* auf EventObject.ServerClass im Queue zuzugreifen, wenn es dieses DatenObjekt nicht mehr gibt
* die Exception im Queue wir in den aufrufenden Thread durchgereicht, aber dort nicht ausgegeben
* und somit wurde der Fehler nicht angezeigt

* dann war bei den DataSnap-Admin-Methoden ala DSAdmin.GetServerMethodParameters die ServerClass = nil

* und da es selten Spaß macht die IDE mehrfach zu starten, seit es Recovery gibt und die IDe extrem langsam geworden ist (in den letzten 15 Jahren immer mehr)
* hatte ich den Serverprozess ohne Debugger gestartet

Zitat:

Delphi-Quellcode:
procedure TServerContainer1.DSAuthenticationManager1UserAuthorize(
  Sender: TObject; EventObject: TDSAuthorizeEventObject;
  var valid: Boolean);
begin
  TThread.Queue(nil, procedure
    begin
      Form1.Memo1.Lines.Add(Format('UserAuthorize User=%s ServerClass=%s MethodAlias=%s',
        [EventObject.UserName, EventObject.ServerClass.ClassName, EventObject.MethodAlias]));
    end);

Delphi-Quellcode:
procedure TServerContainer1.DSAuthenticationManager1UserAuthorize(
  Sender: TObject; EventObject: TDSAuthorizeEventObject;
  var valid: Boolean);
var
  Log: string;
begin
  if Assigned(EventObject.ServerClass) then
    Log := Format('UserAuthorize User=%s ServerClass=%s MethodAlias=%s',
      [EventObject.UserName, EventObject.ServerClass.ClassName, EventObject.MethodAlias])
  else
    Log := Format('UserAuthorize User=%s ServerClass=nil MethodAlias=%s',
      [EventObject.UserName, EventObject.MethodAlias]);
  TThread.Queue(nil, procedure
    begin
      Form1.Memo1.Lines.Add(Log);
    end);


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 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