![]() |
Fehlerbehandlung SOAP Webservice THTTPRio
Hallo,
bei einem Projekt das noch auf SOAP Webservices aufbaut (und das nicht mal eben so auf REST/JSON umgesetllt werden kann) ist aufgefallen, dass Kommunikationsprobleme (nicht erreichbarer host, nicht auflösbarer Name) anscheinend allesamt mit einem EDOMParseError "XML document must have a top level element. Line: 0" quittiert werden. Gibt es da eine Möglichkeit das genauer herauszubekommen, also eindeutig ein "Keine Verbindung"? Ein Parse Error Kann ja auch bedeuten, dass ich zwar eine Verbindung bekommen habe, aber nichts oder eben kein XML zurück bekommen habe. Beispielprogramm (Memo und Button auf Form klatschen) liefert bei mir (Delphi 10.2.3 pro) für alle drei Fälle die oben genannte Exception
Delphi-Quellcode:
implementation
{$R *.dfm} uses InvokeRegistry, Soap.SOAPHTTPClient; type IMySoapintf = interface (IInvokable) ['{70366272-3F96-4A9D-B87E-70DAFDC55003}'] function GetData(): string; stdcall; end; function MakeSoapCall(const Url: string): string; var HttpRio: THttpRio; soapEngine: IMySoapintf; begin HttpRio := THttpRio.Create(nil); try soapEngine := HTTPRIO as IMySoapintf; HTTPRIO.Url :=Url + '/MyModule/SOAP/IMySoapintf'; finally if soapEngine = nil then begin FreeAndNil(HttpRio); end; end; if Assigned(SoapEngine) then begin try ShowMessage(soapEngine.GetData()); except on E: Exception do begin Result := E.ClassName + #13#10#13#10 + E.Message; end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; urls: TStringList; begin Memo1.Clear(); urls:= TStringList.Create(); urls.Add('http://invalid-hostname.sajfsajf'); // invalid or non resolvable hostname urls.Add('http://10.0.0.300'); // invalid IP address urls.Add('http://10.0.0.30'); // non existing IP address for I := 0 to urls.Count -1 do begin Memo1.Lines.Add(urls[i]); Memo1.Lines.Add(MakeSoapCall(urls[I])); Memo1.Lines.Add(''); Memo1.Lines.Add('*****************************'); Memo1.Lines.Add(''); end; end; initialization InvRegistry.RegisterInterface(TypeInfo(IMySoapintf)); {register the interface} |
AW: Fehlerbehandlung SOAP Webservice THTTPRio
Da bin ich auch gespannt, ob es eine Lösung außer kompletter Eigenentwicklung gibt. Hab bisher einfach nur im Fehlerfall ein Verbindungsproblem gemeldet.
Sherlock |
AW: Fehlerbehandlung SOAP Webservice THTTPRio
THTTPRio kann - gesteuert über USE_INDY - intern entweder Indy oder WinHTTP verwenden (siehe
![]() Vielleicht hilft es dies umzustellen. Alternativ: einen lokalen Proxyserver in die Verbindung einbauen, und dessen Fehlerbehandlung nutzen. Die Indy Komponenten enthalten z.B. TIdHTTPProxyServer. Ob der Server aktuell erreichbar ist kann auch z.B. mit einem HTTP Request (z.B. HEAD) überprüft werden, der vor dem SOAP Request per HTTP Client gesendet wird. |
AW: Fehlerbehandlung SOAP Webservice THTTPRio
Hallo, ich bin interessiert ob jemand etwas besseres gefunden hat als einen HealthCheck via HTTP Client zu programmieren?
|
AW: Fehlerbehandlung SOAP Webservice THTTPRio
Grundsätzlich kann man mit einem TIdTCPClient testweise eine Verbindung zum Serverport herstellen. Sowas in der Art:
Delphi-Quellcode:
Sherlock
function IsServerAvailable(const aHostName:string; const aPort:Cardinal):Boolean;
const Timeout_ms = 1000; var tcp: TIdTCPClient; begin Result := False; tcp := TIdTCPClient.Create(nil); try tcp.Host := AHostName; tcp.Port := APort; tcp.ReadTimeout := Timeout_ms; tcp.ConnectTimeout := Timeout_ms; try tcp.Connect; tcp.Disconnect; Result := True; // Success except on E: Exception do begin Result := False; // Not reachable end; end; finally tcp.Free; end; |
AW: Fehlerbehandlung SOAP Webservice THTTPRio
Ja natürlich. Sowas machen ich auch für alle möglichen Dinge...sogar für Datenbanken...Weil ja scheinbar keine Komponente in Klartext melden kann, dass die Gegenstelle nicht erreichbar ist...
Also auch für Soap...irgend eine Form von "Ping Test" gegen Server und Port... Sorry, aber irgendwie regt mich im Moment jeder Pfurz auf... |
AW: Fehlerbehandlung SOAP Webservice THTTPRio
Hallo QuickAndDirty,
kann ich nachvollziehen, geht mir genauso. Das schlimme: Das war ja mal besser. Bei früheren Delphiversionen (zur Absicherung ausprobiert mit XE2) ist dann eine ESOAPHTTPException geflogen, die meiner bescheidenen Meinung nach "etwas" aussagekräftiger waren:
Code:
ESOAPHTTPException
The server name or address could not be resolved - URL:http://10.0.0.300/MyModule/SOAP/IMySoapintf - SOAPAction:urn:Unit1-IMySoapintf#GetData Ich bin jetzt einfach hergegangen, und hab die vorhandenen on E: ESOAPHTTPException do-Blöcke dupliziert und mit EDomParseError nochmal eingefügt. Nicht schön, hätte es auch lieber sauber, aber für meinen Anwendungsfall (hoffentlich) ausreichend. |
AW: Fehlerbehandlung SOAP Webservice THTTPRio
@christophspaeth:
Das haben die ausgebaut? Warum ? Das klingt doch verständlich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:03 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