![]() |
Dateiversand via SOAP
Hallo Gemeinschaft!
Ich habe eine SOAP-Server-Anwendung geschrieben sowie 2 clients dazu, mit Hilfe derer ich Dateien als dynamisches Byte Array hin und her schicken kann. Das hat nun schon einige Wochen fehlerfrei funktioniert, allerdings wurden nur kleine Dateien versendet. Jetzt habe ich es mal mit einer 117MB großen Datei probiert und siehe da: Ich krieg clientseitig den Fehler, dass ich zu wenig Arbeitsspeicher habe. Gut, der Rechner hier hat nur 1GB, das ist nicht viel, aber .. ich sehe auch nicht sofort, wieso es nicht reichen sollte... Ich habe mir direkt vor der Übergabe des dyn. Byte-Arrays an die entsprechende Funktion des Servers den zur Verfügung stehenden Arbeitsspeicher ausgeben lassen: es waren 500MB. Und sobald ich weitergeh, schnippst die Auslastung nach oben und der Client kackt ab. Habe es dann mal an einem anderen Rechner getestet, dort waren über 850MB freier Arbeitsspeicher vorhanden, aber die waren auch nicht ausreichend. Hier mal der Code-Ausschnitt:
Delphi-Quellcode:
Ist im Endeffekt nichts sagend, der Code, oder?
cl_s_var:=GetIWebService(true); // InstanzVar der Klasse, die die vom Server über die WSDL-Datei
// zur Verfügung gestellten Funktionen und Prozeduren enthält screen.Cursor := crHourGlass; try showmessage(memstat); // hier sagt er mir, es stehen 500MB Arbeitsspeicher zur Verfügung ref_id:=cl_s_var.filereceiver(bda64); // Auslastung schnippst nach oben, paar Sekunden später kommt der Fehler finally screen.Cursor := crDefault; end; Trotzdem die Frage: Woran kann das liegen? Vielen Dank schonmal für Eure Mithilfe!! MfG hyype |
Re: Dateiversand via SOAP
Grosse Datenmengen sollte/darf man nicht direkt im soap-body verschicken, weil sonst die Daten
auf der Leitung extrem aufgeblasen werden. Ausserdem verkraften die beteiligten XML-Parser diese Datenmenge meistens nicht, weil beim Document Object Modell alles im Speicher sein muss. Es gibt bei SOAP eine Erweiterung, dass man grosse Datenmengen als MIME Attachments anhängen kann. ![]() |
Re: Dateiversand via SOAP
Zitat:
|
Re: Dateiversand via SOAP
Vielen Dank für eure Antworten!
@shmia: Weißt du, wie ich SOAP mit MIME Attachements in Delphi umsetzen kann? Z.Z. läuft die Kommunikation ja so, dass die Datei als Übergabeparameter einer vom Server zur Verfügung gestellten Funktion vom Client zum Server geschickt wird. Ich wüsste jetzt so spontan nicht, was ich daran ändern müsste/könnte.. :/ Alternativ: Könnte ich evtl die Datei clientseitig zerstückeln und auf dem Server wieder zusammensetzen? Und: Was ist denn die maximale Dateigröße, die ich via SOAP bedenkenlos versenden kann? |
Re: Dateiversand via SOAP
Kann ich große Dateien evtl als SOAPAttachment verschicken?
edit: Ich habe mir zum Test ein function in der Server-Application geschrieben, die ein SOAPAttachment empfängt und siehe, das hat super funktioniert. Daraufhin habe ich aus den TByteDynArrays TSOAPAttachments gemacht und jetzt ist etwas sehr merkwürdiges passiert: Nach dem Import der WSDL-Datei haben nun alle functions den Rückgabewert TSOAPAttachment. Es hat aber eigentlichi nur eine function diesen Rückgabewert, sprich: die WSDL-Datei belügt den Client ^^ Woran kann das nun wieder liegen? edit2: hier nochmal zur Veranschaulichung ein wenig Code: SERVER:
Delphi-Quellcode:
CLIENT:
function FileReceiver(strMeta:string; Datei:TSOAPAttachment; strGUID:string):integer; stdcall;
function GetUsageInfo:string; stdcall; function GetFile(pk:integer; strGUID:string):TSOAPAttachment; stdcall; function pause(bPaused:boolean):boolean; stdcall; function getpaused:boolean; stdcall; function getLog(s:string):TByteDynArray; stdcall;
Delphi-Quellcode:
Habe mir eben mal die WSDL-Datei angeguckt und die sihet eigentlich gut aus, also passiert der Fehler beim Import derselben...
function FileReceiver(const strMeta: WideString; const Datei: TSOAPAttachment; const strGUID: WideString):
TSOAPAttachment; stdcall; function GetUsageInfo: TSOAPAttachment; stdcall; function GetFile(const pk: Integer; const strGUID: WideString): TSOAPAttachment; stdcall; function pause(const bPaused: Boolean): TSOAPAttachment; stdcall; function getpaused: TSOAPAttachment; stdcall; function getLog(const s: WideString): TSOAPAttachment; stdcall; Auszüge:
XML-Code:
edit2:
<message name="FileReceiver0Request">
<part name="strMeta" type="xs:string"/> <part name="Datei" type="xs:base64Binary"/> <part name="strGUID" type="xs:string"/> </message> <message name="FileReceiver0Response"> <part name="return" type="xs:int"/> </message> Ich bin auf der Suche nach einer Lösung für mein Problem über folgenden Link gestolpert: ![]() |
Re: Dateiversand via SOAP
macht noch jemand mit hier? ^^
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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