Discussion:
Arbeit mit Webservices
(zu alt für eine Antwort)
Rene Kadner
2014-07-22 08:41:54 UTC
Permalink
Hallo,

ich habe einen Webservice für den IIS in C# geschrieben und kann diesen von
Delphi aus ansteuern. Eigentlich ist alles gut.
Nun bekomme ich aber Instabilitäten. Irgendwann hängt sich der IIS auf. Nach
dem Neustart geht es wieder ein paar Tage. Um der Ursache auf den Grund zu
gehen habe ich ein kleines Testprogramm geschrieben. Das holt sich vom
Webservice nur den String "Hello World". Beim Beobachten der Counter habe
ich festgestellt, dass die Verbindung lange offen bleibt, sobald ich die
Abfrage einmal durchgeführt habe. Beende ich mein Delphi Programm, ist die
Verbindung sofort weg, der Kanal also wieder frei.

Jetzt zu meiner Frage. Was kann ich zur Laufzeit tun, damit der Kanal
ebenfalls wieder sofort freigegeben wird. Bisher habe ich das hier versucht,
aber ohne Erfolg:

Bisher schreibe ich immer kurz:
s := GetAx5ServiceSoap(false, wsUrl).HelloWorld;

Beim Blick in den Wrapper hoffte ich, mit dem Ax5ServiceSoap Objekt irgend
etwas tun zu können:

procedure TForm1.GetHelloWorld;
var s: string;
assp: Ax5ServiceSoap;
begin
assp := GetAx5ServiceSoap(false, wsUrl);
try
try
s := assp.HelloWorld;
except
on e: Exception do s := e.Message;
end;
finally
assp := Nil; // ohne Wirkung
//FreeAndNil(assp); .. LZ-Fehler
//Dispose(@assp); .. LZ-Fehler
//(assp as Ax5ServiceSoap)._Release; .. LZ-Fehler
end;


Das bringt aber leider nichts.
Andere Ideen?

Gruß
René
Peter
2014-07-22 18:18:21 UTC
Permalink
Post by Rene Kadner
Hallo,
ich habe einen Webservice für den IIS in C# geschrieben und kann
diesen von Delphi aus ansteuern. Eigentlich ist alles gut. Nun
bekomme ich aber Instabilitäten. Irgendwann hängt sich der IIS auf.
Nach dem Neustart geht es wieder ein paar Tage. Um der Ursache auf
den Grund zu gehen habe ich ein kleines Testprogramm geschrieben. Das
holt sich vom Webservice nur den String "Hello World". Beim
Beobachten der Counter habe ich festgestellt, dass die Verbindung
lange offen bleibt, sobald ich die Abfrage einmal durchgeführt habe.
Beende ich mein Delphi Programm, ist die Verbindung sofort weg, der
Kanal also wieder frei.
Jetzt zu meiner Frage. Was kann ich zur Laufzeit tun, damit der Kanal
ebenfalls wieder sofort freigegeben wird. Bisher habe ich das hier
s := GetAx5ServiceSoap(false, wsUrl).HelloWorld;
Beim Blick in den Wrapper hoffte ich, mit dem Ax5ServiceSoap Objekt
procedure TForm1.GetHelloWorld;
var s: string;
assp: Ax5ServiceSoap;
Ax5ServiceSoap ist ein Interface, die Lebensdauer des dahinterliefenden
Objektes wird also per reference counting geregelt.

Wenn ich mich recht erinnere arbeitet das Delphi SOAP framework so,
dass es das interface für den Webservice irgendwo ablegt, so das nicht
für jeden Methodenaufruf eine neue Verbindung mit dem Server aufgebaut
werden muss. Damit werden nachfolgende Aufrufe schneller, aber die
Verbindung belegt natürlich auf dem Server weiterhin Resourcen.

Das Ganze ist irgendwo in the THTTPRIO-Klasse vergraben, wenn ich mich
nicht irre.
--
Peter Below
Rene Kadner
2014-07-23 11:30:26 UTC
Permalink
Hallo Peter,
Post by Peter
Das Ganze ist irgendwo in the THTTPRIO-Klasse vergraben, wenn ich mich
nicht irre.
mit der THTTPRIO Klasse hatte ich schon erfolglos experimentiert. Ich lass
es jetzt so wie es ist. Die Verbindungen werden nach ca. 3 Minuten
abgeräumt. Das reicht vielleicht - ich hatte vermutet, das dauert viel
länger.

Danke & Gruß
René

Loading...