Laden...

LifetimeService Verständnisproblem bei Remote App API Object

Erstellt von Winfried vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.576 Views
W
Winfried Themenstarter:in
18 Beiträge seit 2020
vor 3 Jahren
LifetimeService Verständnisproblem bei Remote App API Object

Ich habe ein riesiges Verständnisproblem und komme nicht mehr weiter, nachdem ich sehr viel über dieses Thema gelesen habe.
Zu allererst, ich habe keine Webanwendung, sondern lediglich eine Fremd-API, die ich aus meinem Programm heraus benutze. Diese API hat eine Basisklasse APx500, sie ist sealed.
Ich erstelle also am Anfang meines Programms eine Instanz

APx500 APx = new APx500();

darüber kann ich nun wunderbar alle Member und Methoden der anderen Software -diese steuert ein Messgerät- aufrufen.
Alle Member get´s und set´s gehen ja blitzartig, die meisten Methoden brauchen auch nur Millisekunden, aber die Haupt-Prozedur, das starten der Messung hat irgendwann ein Problem:
gestartet mit

APx.ActiveMeasurement.Run(); 

wird der weitere Ablauf dieses Threads in meinem Programm komplett an das Messinstrument übergeben. In der Regel wird 1-3 Minuten etwas gemessen, dann kommt das Programm "zurück" und mein Programm arbeitet die nächsten Zeilen ab, die z.B. die Ergebnisse abfragen und ausgeben.
In etlichen Fällen aber, wird nach dem Start des measurement.Run() von der anderen Software ein gewollter Prompt mit einer Anweisung erzeugt, die bestätigt werden muss. Dann erst erfolgt die Messung. Wenn man nun tatsächlich länger als 300s diesen Prompt stehen lässt, dann OK drückt, ist das Remote Object nach der Rückkehr nicht mehr vorhanden. die Fehlermeldung:> Fehlermeldung:

Das Objekt wurde getrennt oder ist am Server nicht vorhanden

Also exakt nach der Standard LifeTime Zeit von 300s.

Was ich nun nicht verstehe, wo setze ich denn das public override object InitializeLifeTimeService ein? Wo greift das? Ich kann mit der externen Klasse ja nichts weiter machen, als installieren und aufrufen?
Mal abgesehen davon, weiß ich ja noch nicht einmal, ob das hilft, da ich den Mechanismus noch nicht verstanden habe, ich will ja kein Webobjekt am Leben erhalten, oder verstehe ich das nur komplett falsch?

Für einen kurzen Denkanstoss mit Hilfe wäre ich sehr dankbar. 8)

16.806 Beiträge seit 2008
vor 3 Jahren

Ich vemute, dass Du von .NET Remoting sprichst, kann das aber letzten Endes nur daraus schließen weil Du von InitializeLifeTimeService sprichst.

Info: .NET Remoting wird schon ewig nicht mehr unterstützt, da liegen schon 2,5 Technologien (und ~15 Jahre) zwischen der aktuellsten Technologie für sowas: gRPC.
Remoting hat das Problem, dass es in ganz ganz arg vielen Szenarien gar nicht mehr funktioniert.

Ich kann (und will) Dir nicht abnehmen, dass Du in Dokumentationen schauen musst, dass Du grundsätzlich verstehst, wie etwas funktioniert.
InitializeLifeTimeService wird öfter gecallt, aber nur im Initial Lease wird er konfiguriert.

Ich bin absolut nicht mehr fit in der über 15 Jahre alten Technologie, aber soweit war es auch damals schon so, dass der Client sicherstellen muss, dass der LifeTimeService valide existiert, zB mit GetLifetimeService.
Auf der Serverseite kann ein Lease immer ablaufen; liefert an den Client aber immer den aktuellsten.

Aber Du wirst schneller an Dein Ziel kommen Dich - in zumindest die ersten Kapitel - einzulesen.
Das Forum ist ja prinzipiell auch nicht dazu da, dass es für Dich das Erlernen der Grundlagen übernimmt.
Das ist nicht umsetzbar 😃

W
Winfried Themenstarter:in
18 Beiträge seit 2020
vor 3 Jahren

Die Grundlagen versuche ich mir ja tatsächlich ausserhalb des Forums anzulesen. Aber ab einem gewissen Punkt komme ich nicht weiter, darauf wollte ich hinaus.

Was es genau ist, weiss ich eben nicht, das kann ich nur anhand der Fehlermeldung "googeln" und da komme ich auf genau dieses remoting, die Fehlermeldung verweist auch auf einen transparenten Proxy. Beim Debuggen sind auch alle diese Objekte transparente Proxies.

Vom Hersteller der API habe ich noch keine Antwort, das war meine erste Anlaufstelle.

Ich werde weiter lesen.......

hier die Beschreibung der Klasse:

APx500 Class

This class represents the APx500 software application. It gives access to all functions of the software program including the user interface, making measurements, and getting results.
Inheritance Hierarchy
System.Object
System.MarshalByRefObject
AudioPrecision.API.APx500

16.806 Beiträge seit 2008
vor 3 Jahren

Wünsch Dir viel Glück, aber die Technologie ist soooo alt, dass es da vermutlich auch nur noch Wenige gibt, die da auf Anhieb was sagen können, ohne sich nochmals selbst einzulesen.

W
Winfried Themenstarter:in
18 Beiträge seit 2020
vor 3 Jahren

Danke, habe gerade noch editiert.
Hier die Beschreibung des Objektes:

APx500 Class

This class represents the APx500 software application. It gives access to all functions of the software program including the user interface, making measurements, and getting results.
Inheritance Hierarchy
System.Object
System.MarshalByRefObject
AudioPrecision.API.APx500

4.931 Beiträge seit 2008
vor 3 Jahren

Hallo,

ich hatte mich vor 2 Wochen auch noch mal mit .NET Remoting beschäftigt, da jemand ein ähnliches Problem damit hatte und es ist tatsächlich so, daß diese Methode in den Server-Code rein muß: "Nur eine Instanz pro Anwendung" featuring IPC: InitializeLifetimeService() (wie dort beschrieben geht auch das Setzen der globalen Variable LifetimeServices.LeaseTime - aber auch das ist nur im Server-Code möglich).

Ohne Unterstützung der API-Hersteller wirst du das also so nicht hinbekommen.

W
Winfried Themenstarter:in
18 Beiträge seit 2020
vor 3 Jahren

Hallo Th69,

Danke, das ist der eindeutige Hinweis darauf, was ich schon vermutet hatte.
ich müsste das in der "Fremd"-Klasse implementieren, weil die ja beim instanzieren von der Marshall.. Klasse erbt,
und da komme ich tatsächlich ohne den Hersteller nicht dazwischen.

UPDATE
Was ich gerade herausgefunden habe, ich kann das aktuelle Lebensdauerdienstobjekt des API Objekts abrufen, ob mir das was bringt und ich damit Zugriff auf die Leasetime habe, werde ich heute Abend herausfinden.

16.806 Beiträge seit 2008
vor 3 Jahren

weil die ja beim instanzieren von der Marshall.. Klasse erbt

Das ist korrekt und muss bei .NET Remoting so.