Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   SOAP Webservice, erster Funktionsaufruf dauert ewig (https://www.delphipraxis.net/180295-soap-webservice-erster-funktionsaufruf-dauert-ewig.html)

moe120 8. Mai 2014 16:17

SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Ahoi,

habe einen kleinen SOAP Webservice der an mobile Endgeräte dies und das aus einer Datenbank rausziehen soll je nach Berechtigung. Das an sich klappt wie gewünscht, SOAP Webservice und iPhone-App sind mit XE6 gebaut. Der Import der WSDL klappt auch.

Mein Problem ist nun jedoch, dass die erste Funktion des Webservice die ich vom mobilen Client aus aufrufe 5x so lange braucht wie alle weiteren Aufrufe, also in konkreten Zeiten: 1. Funktionsaufruf = 3000ms, 2. u. weitere Funktionsaufrufe = 600ms.

Jemand sowas schonmal gehabt ?
Es liegt auch nicht an der Funktion, es ist egal welche ich als erstes aufrufe, die erste aufgerufene braucht 3 Sekunden, die 2. dann nur noch 0,6s.

Code-technisch mach ich das im Client in etwa so:

Code:
function get_webservice(url: String; use_ssl: Boolean): Ivp_mobile_webservice;
var tp_prefix: String;
begin

  if use_ssl
  then tp_prefix:= 'https://'
  else tp_prefix:= 'http://';

  if (AnsiPos('http://', AnsiLowerCase(url))<>1)
  and (AnsiPos('https://', AnsiLowerCase(url))<>1)
  then url:= tp_prefix + url;

  Result:= getIvp_mobile_webservice(true, Url + '/wsdl/Ivp_mobile_webservice');

end;


mein_webservice:= get_webservice(url, ssl_ja_nein);

//1. Aufruf, dauert 3 Sekunden
x:= mein_webservice.gib_mir_5();

//2. Aufruf, dauert 0,6Sekunden
x:= mein_webservice.gib_mir_5();

mit SOAPUI kann ich das Problem nicht nachstellen, da dauern alle Aufrufe, auch der 1. nur um die 100ms (über LAN statt 3G + Firewall).

Bernhard Geyer 8. Mai 2014 19:08

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Probier mal statt Servername die IP-Adresse.
Das Problem "erster Aufruf dauert lange" kenne ich wenn Probleme bei der Namensauflösung vorhanden sind.

Union 8. Mai 2014 19:52

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Wird das Interface beim ersten Aufruf erst aus dem WSDL generiert oder hast Du das importiert?

mjustin 9. Mai 2014 07:01

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Falls die WSDL extern erreichbar ist würde ich auf dem mobilen Gerät den Webbrowser verwenden um diese zu öffnen und so die Zeit für den Verbindungsaufbau über 3G / Firewall zu testen.

mquadrat 9. Mai 2014 11:57

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Wie wird der Webservice denn gehostet? Viele Web-Services beenden Anwendungen (in dem Fall deinen Dienst) bei Inaktivität und starten sie dann erst wieder beim ersten Zugriff. Wobei man das schnell ausschließen kann, indem man die App 2x kurz hintereinander startet. Hast du auch beim zweiten Start die Verzögerung, dann kann man das als Fehlerquelle schon mal ausschließen.

moe120 9. Mai 2014 14:34

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1258328)
Probier mal statt Servername die IP-Adresse.
Das Problem "erster Aufruf dauert lange" kenne ich wenn Probleme bei der Namensauflösung vorhanden sind.

hab in dem Einstellungsfeld in meiner App von Hause aus schon eine IP statt Servernamen drin stehen. Das kann es also nicht sein.


Zitat:

Zitat von mjustin (Beitrag 1258362)
Falls die WSDL extern erreichbar ist würde ich auf dem mobilen Gerät den Webbrowser verwenden um diese zu öffnen und so die Zeit für den Verbindungsaufbau über 3G / Firewall zu testen.

guter Hinweis, danke, hab ich probiert aber ... möööp .. Seite mit den WSDL Infos ist in Null komma Nix geladen :)

moe120 9. Mai 2014 14:38

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Zitat:

Zitat von Union (Beitrag 1258330)
Wird das Interface beim ersten Aufruf erst aus dem WSDL generiert oder hast Du das importiert?

die Interface-Sektion des Webservice hab ich bereits per Wizard in das Delphiprojekt importiert (Datei>Neu>Weitere>Webservice>WSDL Import), d.h. alle Funktionen und Parameter sollten bekannt sein.

Aber ich vermute auch dass der beim ersten Start da nochmal was holt, aber was und wo kann man das abstellen wenns nicht unbedingt nötig ist ?

moe120 9. Mai 2014 14:42

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Zitat:

Zitat von mquadrat (Beitrag 1258411)
Wie wird der Webservice denn gehostet? Viele Web-Services beenden Anwendungen (in dem Fall deinen Dienst) bei Inaktivität und starten sie dann erst wieder beim ersten Zugriff. Wobei man das schnell ausschließen kann, indem man die App 2x kurz hintereinander startet. Hast du auch beim zweiten Start die Verzögerung, dann kann man das als Fehlerquelle schon mal ausschließen.

der webservice liegt als .exe im inetpub-Verzeichnis eines IIS, wenn ich die App für Windows compiliere statt aufs iPhone dann hab ich diese Anfangsverzögerung nicht. Ebenfalls kann ich mit der WindowsApp problemlos SSL nutzen was beim iPhone zu einem Fehler führt. (WSDL-Datei/-Ort kann nicht geladen werden: .... Fehler [Wert für IOHandler ist ungültig]) das sollte eig. laut Embarcadero mit XE5 Update1 behoben worden sein aber wurde es wohl nicht.

Das 2x Nacheinanderstarten hab ich probiert, keine Änderung

Union 9. Mai 2014 14:50

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Vermutlich werden unter iOS noch diverse dylib geladen beim ersten Start. Ansonsten erfolgt die Neugenerierung aus WSDL nur wenn Du sie mit True als erstem Parameter aufrufst, der default ist False.

moe120 9. Mai 2014 14:58

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Liste der Anhänge anzeigen (Anzahl: 1)
habs jetzt mal mit false statt true als ersten Parameter probiert
Code:
Result:= getIvp_mobile_webservice(false, Url + '/wsdl/Ivp_mobile_webservice');
Aber da krieg ich den Fehler siehe Anhang. (das #2406... Version prüfen..) ist ein Fehlercode von mir damit ich weiss an welcher Stelle es geknallt hat) Mir deucht einer der 40-Tausend nicht näher dokumentierten Haken beim WSDL-Import Wizard ist falsch gesetzt ?

Komisch ist auch dass der Aufruf dieser Zeile (mit true statt false) nur schlappe 50ms dauert, sollte er da nicht schon losschlagen und sich alles holen wenn das die Ursache ist?

Union 9. Mai 2014 15:07

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Mir deucht die URL ist falsch. Das scheint ja die für das WSDL zu sein. Hast Du den Import über das Netz gemacht oder aus einer lokalen Datei? Wie sehen denn die const aus (defWSDL, defURL ...)?

moe120 9. Mai 2014 15:53

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Union (Beitrag 1258445)
Mir deucht die URL ist falsch. Das scheint ja die für das WSDL zu sein. Hast Du den Import über das Netz gemacht oder aus einer lokalen Datei? Wie sehen denn die const aus (defWSDL, defURL ...)?


die sehen so aus:
Code:
function GetIvp_mobile_webservice(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Ivp_mobile_webservice;
const
  defWSDL = 'C:\temp\Ivp_mobile_webservice.xml';
  defURL = 'http:// -ip rausgenommen- /cgi/vp_webservice.exe/soap/Ivp_mobile_webservice';
  defSvc = 'Ivp_mobile_webserviceservice';
  defPrt = 'Ivp_mobile_webservicePort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
die defURL kann ich so wie sie da steht problemlos aufrufen, die sollte passen.
Die WSDL Definition hol ich mir per XML von dieser Adresse per Rechtsklick auf "WSDL" > Speichern unter (s. Screenshot), und die XML die dabei rauskommt importiere ich dann per Delphi wann immer sich mal was am Webservice geändert hat.

moe120 9. Mai 2014 15:59

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
bin ein stück weiter, musste lediglich das /wsdl mit /soap ersetzen
Code:
//also entweder
Result:= getIvp_mobile_webservice(false, Url + '/soap/Ivp_mobile_webservice');
//oder
Result:= getIvp_mobile_webservice(true, Url + '/wsdl/Ivp_mobile_webservice');
//aber nicht
Result:= getIvp_mobile_webservice(false, Url + '/wsdl/Ivp_mobile_webservice');
mal schauen obs nun auf dem iphone schneller klappt

Union 9. Mai 2014 16:03

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Hauptsache Du benutzt kein ssl für iOS und SOAP client. Das müsstest Du Dir zuerst statisch einbinden.

moe120 9. Mai 2014 16:05

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
jupp das wars :-) jetzt dauert der erste Funktionsaufruf auch nur noch 0,6 Sekunden.
Danke Union + allen anderen.

himitsu 11. Mai 2014 10:47

AW: SOAP Webservice, erster Funktionsaufruf dauert ewig
 
Zitat:

Zitat von moe120 (Beitrag 1258316)
Code:
function get_webservice(url: String; use_ssl: Boolean): Ivp_mobile_webservice;
var tp_prefix: String;
begin

  if use_ssl
  then tp_prefix:= 'https://'
  else tp_prefix:= 'http://';

  if (AnsiPos('http://', AnsiLowerCase(url))<>1)
  and (AnsiPos('https://', AnsiLowerCase(url))<>1)
  then url:= tp_prefix + url;

  Result:= getIvp_mobile_webservice(true, Url + '/wsdl/Ivp_mobile_webservice');

end;

Mal als kleines Beispiel, aber da kann man auch locker vieles an Code einsparen, bzw. auch durch passende Funktionen den Code verständlicher und vorallem fehlerunanfälliger machen.
Pos/AnsiPos > Delphi-Referenz durchsuchenStartsStr und Hier im Forum suchenStartsText, wobei die 1 auch Probleme bereitet, dann in den neuen mobilen Compilern fangen Strings nicht mehr bei 1 an.
Delphi-Quellcode:
function get_webservice(url: String; use_ssl: Boolean): Ivp_mobile_webservice;
begin
  if not StartsText('http://', url) and not StartsText('https://', url) then
    url := IfThen(use_ssl, 'https://', 'http://') + url;

  Result := getIvp_mobile_webservice(True, url + '/wsdl/Ivp_mobile_webservice');
end;
PS: Wenn du zukünftig das [DELPHI]- statt dem [CODE]-Tag verwendest, dann läßt sich der Code auch einfacher lesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz