![]() |
SOAP mit gzip-Übertragung
Hallo,
ich versuche gerade SOAP-Nachricht die per gzip gepackt ist zu entpacken. An vielen Stellen im Netz gibt es da die einfache Möglichkeit per:
Delphi-Quellcode:
gzip anzufordern und auch durch WinInet wieder entkodieren zu lassen. Problem ist, bei mir gibt es immer die Exception "Die Inhaltsdecodierung ist fehlgeschlagen."
procedure TfrmMain.HTTPRIOHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
Data: Pointer); const contentEncodingHeader : WideString = 'Accept-Encoding: gzip, deflate'; var Flag: LongBool; begin Flag := True; if not HttpAddRequestHeaders(Data, PWideChar(contentEncodingHeader), Length(contentEncodingHeader), HTTP_ADDREQ_FLAG_ADD) then RaiseLastOSError; if not InternetSetOption(Data, INTERNET_OPTION_HTTP_DECODING, @Flag, SizeOf(Flag)) then RaiseLastOSError; end; Ich habe per WireShark nachgeprüft, die Daten kommen gepackt an. System: Windows 7, IE11, Delphi XE5 Hat jemand eine Idee woran das liegen könnte? |
AW: SOAP mit gzip-Übertragung
Wie sieht denn das SOAP-Paket aus? Was sagt Fiddler im SOAP-Modus dazu?
|
AW: SOAP mit gzip-Übertragung
Das SOAP-Paket was zum Server geht ist nicht gezippt, sieht gut aus. Das Paket was vom Server zurück kommt ist gepackt (gzip), ausgepackt sieht es auch gut aus (Fiddler).
|
AW: SOAP mit gzip-Übertragung
Hast Du es mal so versucht:
Delphi-Quellcode:
InternetSetOption(Data, INTERNET_OPTION_HTTP_DECODING,
PChar(@Flag), SizeOf(Flag)); |
AW: SOAP mit gzip-Übertragung
Ja, habe ich - keinen Erfolg. Allerdings macht es eh keinen Unterschied ob man das vorher in einen anderen Typ verwandelt... Pointer bleibt Pointer.
SoapUI sagt auch, das alles in Ordnung ist und auch eine Validierung des Ergebnisses gegen den Server zeigte keine Fehler. |
AW: SOAP mit gzip-Übertragung
Im Endeffekt habe ich nun 7zip verwendet um die Daten zu dekomprimieren. Funktioniert hervorragend.
|
AW: SOAP mit gzip-Übertragung
Ist denn das ganze Paket gezippt oder nur ein bestimmter Wert? Wenn es nur ein bestimmter Response Wert wäre, könntest Du den in ein TBytes schreiben und dann mit Soap.EncdDecd.DecodeBase64 und IDZlib.DecompressStream umwandeln. Hier mal ein Beispiel, wo die Response ein komplettes Dataset darstellt, das gezipped und base64-codiert ist:
Delphi-Quellcode:
Der return-Wert sah dann z.b. so aus (return mit ... gekürzt):
// WSDL-Generierte Interfacefunktion
function GetUserReports(const Sessionid: string): TByteDynArray; stdcall; function TQCClient.GetUserReports: boolean; var UserReportData : TByteDynArray; begin UserReportData := IQC.GetUserReports(FSessionID); DynArrayToDataSet(UserReportData); result := True; end; procedure TQCClient.DynArrayToDataset(ADynArray: TByteDynArray); var InStream : TMemoryStream; OutStream : TStringStream; DecodedData : TBytes; begin DecodedData := DecodeBase64(AnsiString(ADynArray)); InStream := TMemoryStream.Create; try InStream.Write(DecodedData, length(LoginData)); InStream.Position := 0; OutStream := TStringStream.Create; try DecompressStream(InStream, OutStream); OutStream.Position := 0; FDataSet.Active := False; FDataSet.LoadFromStream(OutStream); FDataSet.Active := True; finally OutStream.Free; end; finally InStream.Free; end; end;
Code:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <NS1:GetUserReportsResponse xmlns:NS1="urn:CDSReportPublicInterfaceIntf-ICDSReportPublicInterface"> <return xsi:type="xsd:base64Binary">ZUp6VVhHdHo0a2F6L2l0VHBDcGwxOEZZRis2Sms4SmNkamxyR3dmazNleEpwVndDRGFCWVNLd3V0...</return> </NS1:GetUserReportsResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
AW: SOAP mit gzip-Übertragung
Nein, das gesamte Paket. Der Server komprimiert den kompletten Request mit gzip. Quasi so, wie wenn man im Browser Content-Type: gzip anfordert.
Ich habe einfach einen eigenen Converter geschrieben der die Daten entgegennimmt und wenn sie mit gzip komprimiert sind entkomprimiert. |
AW: SOAP mit gzip-Übertragung
Und was steht im content-encoding des Antwortpakets genau drin: deflate oder gzip? Es kann u.U. sein, dass ein Virenscanner den rausfiltert.
|
AW: SOAP mit gzip-Übertragung
Und was steht im content-encoding des Antwortpakets genau drin: deflate oder gzip? Es kann u.U. sein, dass ein Virenscanner den rausfiltert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 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