Mit Delphi 10.3 wurden umfangreiche Änderungen realisiert. Die
SOAP Komponenten bauen jetzt auf THTTPClient auf, einer Embarcadero eigenen Implementierung. Das ist eigentlich gut, scheint aber manchmal doch noch betriebssystemabhängig zu sein.
Es scheint auch so zu sein, dass der Fehler nur in Verbindung mit bestimmten Zertifikaten auftritt. Anscheinend, wird dann ein Protokoll ausgewählt, was der Server ablehnt.
Workaround:
Delphi-Quellcode:
procedure TForm1.ProcessShipment(out sresp: ShipmentResponse; const RequestStream, ResponseStream: TMemoryStream);
var
prio: THTTPRIO;
port: ShipPortType;
h: TUPSWebServiceHandler;
begin
h := TUPSWebServiceHandler.Create(RequestStream, ResponseStream);
try
prio := THTTPRIO.Create(nil);
prio.HTTPWebNode.OnBeforePost:=SoapBeforePost; //Vor jedem Post ausführen
port := GetShipPortType(False, UPSWEBSERVICE_SHIPMENT_URL, prio);
sresp := port.ProcessShipment(nil, nil); // diese Zeile wirft den Fehler
finally
h.Free;
end;
end;
procedure TForm1.SoapBeforePost(const HTTPReqResp: THTTPReqResp; Client: THTTPClient);
begin
Client.SecureProtocols:=[THTTPSecureProtocol.TLS11, THTTPSecureProtocol.TLS12];
end;
SoapBeforePost wird dann vor jeder Operation aufgerufen und dort kann der THTTPClient direkt beeinflusst werden. THTTPSecureProtocol.TLS12 verwendet dann TLS12 was von vielen Servern akzeptiert wird.