Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   [FMX] SOAP-Timeout(s) setzen (https://www.delphipraxis.net/186987-%5Bfmx%5D-soap-timeout-s-setzen.html)

DeddyH 19. Okt 2015 11:22

[FMX] SOAP-Timeout(s) setzen
 
Ich versuche gerade, für einen SOAP-Request Timeout-Werte zu vergeben. Dazu habe ich mir eine HTTPRIO-Instanz erstellt, welche ich beim Ermitteln des Webservice-Interface mit übergebe.
Delphi-Quellcode:
  RIO := THTTPRIO.Create(nil);
  try
    RIO.HTTPWebNode.ConnectTimeOut := FConnectTimeOut;
    RIO.HTTPWebNode.SendTimeOut := FSendTimeOut;
    RIO.HTTPWebNode.ReceiveTimeOut := FReceiveTimeOut;
    try
      FService := GetTestService(false, aURI, RIO);
      Result := Assigned(FService);
Nach Durchforsten der Sourcen musste ich zu meinem Erstaunen feststellen, dass die Timeouts wohl über WinInet gesetzt werden (InternetSetOption), was ja mobil wenig Sinn macht, allerdings bin ich durch das IFDEF-Gewusel nicht ganz sicher in dieser Hinsicht. Nun also meine Frage: gibt es noch eine andere Möglichkeit, Timeout-Werte zu vergeben, oder muss ich mal wieder auf mobilen Plattformen damit leben?

DeddyH 20. Okt 2015 11:17

AW: [FMX] SOAP-Timeout(s) setzen
 
Ein zartes *Push*, das Problem besteht nach wie vor. Wenn ich z.B. mit meinem Android-Smartphone von zu Hause aus versuche, den Webservice im LAN unserer Firma zu erreichen, wartet die App ewig bis zur Android-Meldung "App XXX reagiert nicht". Das ist ja kein haltbarer Zustand.

Darlo 20. Okt 2015 11:38

AW: [FMX] SOAP-Timeout(s) setzen
 
Ich hab im FormCreate folgendes dafür
Delphi-Quellcode:
 Soap.SOAPHTTPTrans.THTTPReqResp.Create(self).ReceiveTimeout := 5000;

DeddyH 20. Okt 2015 11:58

AW: [FMX] SOAP-Timeout(s) setzen
 
Und das funktioniert auf mobilen Plattformen? Immerhin wird ja letztendlich derselbe Code wie bei mir durchlaufen.

Sherlock 20. Okt 2015 12:26

AW: [FMX] SOAP-Timeout(s) setzen
 
In den SOAP Abgründen wird ab einem mir unbekannten Zeiptunkt per IFDEF USE_INDY abgefragt. Wenn das gesetzt ist, sollte es auch plattformübergreifend gehen.

USE_INDY kommt, sobald man POSIX defniiert hat...

Sherlock

DeddyH 20. Okt 2015 12:45

AW: [FMX] SOAP-Timeout(s) setzen
 
Ja, das hatte ich schon entdeckt, auch den Kommentar ;)
Zitat:

Delphi-Quellcode:
{ Can these be exposed when using Indy too?? }
    property ConnectTimeout: Integer read FConnectTimeout write FConnectTimeout;
    property SendTimeout: Integer read FSendTimeout write FSendTimeout;
    property ReceiveTimeout: Integer read FReceiveTimeout write FReceiveTimeout;

Das Setzen der Timeouts erfolgt an einer einzigen Stelle (THTTPReqResp.Send).
Zitat:

Delphi-Quellcode:
if FConnectTimeout > 0 then
      Check(not InternetSetOption(Request, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FConnectTimeout), SizeOf(FConnectTimeout)));

Ich habe eine Grep-Suche über die Indy-Sourcen laufen lassen, InternetSetOption wurde nirgends gefunden, von daher gehe ich davon aus, dass es sich um WinInet handelt.

[edit] Eben stand ich noch am Abgrund, jetzt bin ich einen Schritt weiter :mrgreen:
Delphi-Quellcode:
var
  RIO: THTTPRIO;
  {$IFDEF POSIX}
  Handler: TIdIOHandler;
  {$ENDIF}
begin
  {$IFDEF POSIX}
  Handler := nil;
  {$ENDIF}
  RIO := THTTPRIO.Create(nil);
  try
    {$IFDEF POSIX}
    Handler := TIdIOHandler.MakeDefaultIOHandler(nil);
    RIO.HTTPWebNode.IOHandler := Handler;
    {$ENDIF}
    RIO.HTTPWebNode.{$IFDEF POSIX}IOHandler.{$ENDIF}ConnectTimeOut :=
      FConnectTimeOut;
    {$IFNDEF POSIX}RIO.HTTPWebNode.SendTimeOut := FSendTimeOut; {$ENDIF}
    RIO.HTTPWebNode.
    {$IFDEF POSIX}IOHandler.ReadTimeOut{$ELSE}ReceiveTimeOut{$ENDIF} :=
      FReceiveTimeOut;

    try
      FService := GetTestService(false, aURI, RIO);
Aaaaber... Zitat aus der Indy-Hilfe:
Zitat:

ConnectTimeout is not used in TIdIOHandler, but is provided for compatibility purposes. ConnectTimeout allows a client using a socket-based IOHandler, like TIdIOHandlerStack, to access the protocol stack to set the timeout value.

Use the ConnectTimeout property in the TIdTCPClient to set the connection timeout without specific access to an IOHandler.

Ich werd noch wahnsinnig :wall:[/edit]

DeddyH 21. Okt 2015 08:27

AW: [FMX] SOAP-Timeout(s) setzen
 
So, ich hab's durch einen Patch hinbekommen. Dazu musste ich die Unit Soap.SOAPHTTPTrans sowie die CompVer.inc ins Projektverzeichnis kopieren und in der SOAPHTTPTrans 2 Zeilen einfügen.
Delphi-Quellcode:
{$IFDEF USE_INDY}
  procedure PostData(const Request: TStream; Response: TStream);
  var
    IndyHTTP: TIDHttp;
  begin
    IndyHTTP := TIDHttp.Create(Nil);
    try
      SetupIndy(IndyHTTP, Request); //Zeile 1530

      //D.H.
      //Timeouts setzen
      IndyHTTP.ConnectTimeout := FConnectTimeout;
      IndyHTTP.ReadTimeout := FReceiveTimeout;
Zumindest unter Android werden die Timeouts jetzt berücksichtigt, iOS konnte ich noch nicht testen. Vielleicht hilft es ja jemandem.

Sherlock 3. Mai 2016 15:25

AW: [FMX] SOAP-Timeout(s) setzen
 
Unter iOS scheint es damit nicht zu funktionieren. Ich denke, ich habe alles richtig gemacht. Unter Windows werden die gesetzten Timeouts berücksichtigt, unter iOS leider nicht.

Sherlock


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