Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Dateiversand via SOAP (https://www.delphipraxis.net/128007-dateiversand-via-soap.html)

hyype 22. Jan 2009 15:22


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:
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;
Ist im Endeffekt nichts sagend, der Code, oder?
Trotzdem die Frage:
Woran kann das liegen?
Vielen Dank schonmal für Eure Mithilfe!!
MfG
hyype

shmia 22. Jan 2009 15:41

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.
http://www.w3.org/TR/SOAP-attachments

mjustin 22. Jan 2009 16:32

Re: Dateiversand via SOAP
 
Zitat:

Zitat von hyype
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.

Man könnte statt der Daten einen Link auf eine Resource auf einem HTTP oder FTP Server versenden. JMS Message Broker (wie z.B. ActiveMQ) bieten dies als eigenen Nachrichtentyp an. (Alternative Lösung, falls die Umsetzung von SOAP mit Attachments sich in Delphi nicht so einfach realisieren lässt.)

hyype 23. Jan 2009 08:14

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?

hyype 26. Jan 2009 08:50

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:
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;
CLIENT:
Delphi-Quellcode:
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;
Habe mir eben mal die WSDL-Datei angeguckt und die sihet eigentlich gut aus, also passiert der Fehler beim Import derselben...
Auszüge:
XML-Code:
  <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>
edit2:
Ich bin auf der Suche nach einer Lösung für mein Problem über folgenden Link gestolpert:
http://www.codinggroups.com/borland-...io-2007-a.html

hyype 27. Jan 2009 12:00

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