![]() |
TIdHttpServer und XML
Hallo,
ich habe gerade die Aufgabe einen HTTP - Server zu basteln, der XML versteht. Und zwar soll das so funktionieren. Ein Client sendet via POST Kommando ein XML Dokument. Mein Server empfängt es und soll als Antwort (Response) ein anderes XML Dokument senden, welches auf den Inhalt des empfangenen Docs reagiert. Ich habe dazu eine TIdHTTPServer- und eine TXMLDocument - Komponente verwendet. Nun klappt das auch schon mit dem Empfangen des XML Docs. Doch wenn ich dann in dem Ereignis OnCommandGet des Servers das bereits als Datei gespeicherte XML auswerten möchte, sagt mir TXMLDocument, das die Datei nicht zu öffnen wäre. Mach ich das Ganze ausserhalb des OnCommandGet - Ereignisses wird das XML gelesen und ausgewertet. Leider hat der Server dann schon ein schlichtes 200 - OK gesendet und die Session ist beendet. :?: Kennt jemand eine Lösung oder weiss einen Link der mir weiterhilft? Bei Indy selbst hab ich nix gefunden. |
Re: TIdHttpServer und XML
Zitat:
Falls du ein TFileStream-Objekt benutzt, ist zu beachten, dass die Datei solange zum Schreiben geöffnet ist, bis das TFileStream-Objekt gefree'd wird. |
Re: TIdHttpServer und XML
Danke für den schnellen Tip,
doch ich mach das ganz unkonventionell! Ich hole mir die Daten im OnCommandGet via TStringStream. Das sieht dann so aus: myData := (aRequestInfo.PostStream AS TStringStream).DataString; Dazu habe ich beim HTTP-Server an das Ereignis OnCreatePostStream die folgende Prozedur gehängt: procedure TFrmMain.myHTTPServerCreatePostStream(ASender: TIdPeerThread; var VPostStream: TStream); begin VPostStream := TStringStream.Create(''); end; //================================================== ====================== Die Daten in myData speichere ich mit der folgenden Prozedure procedure TFrmMain.SaveDataToFile( filename: String; data: String); var f : TextFile; begin AssignFile( f, filename); Rewrite( f); Write( f, data); CloseFile( f); end; //================================================== ====================== Also eigentlich nichts was noch nicht geschlossen ist! Oder siehst Du in dem VPostStream ein Problem? |
Re: TIdHttpServer und XML
Zitat:
Ich würde allerdings so speichern: (die procedure ist "moderner" und eleganter)
Delphi-Quellcode:
Später (wenn alles klappt) kannst du dann [TStream].CopyFrom benützen, ohne Umweg über einen String.
procedure StringToFile(const FileName, Contents: AnsiString);
var fs: TFileStream; len: Integer; begin fs := TFileStream.Create(FileName, fmCreate); try len := Length(Contents); if len > 0 then fs.WriteBuffer(Contents[1], Length(Contents)); finally fs.Free; end; end; Das Nächste, was du prüfen musst, ist der Dateiname der gespeicherten XML-Datei. Du weisst: ein falscher Buchstabe (oder fehlender Backslash) im Dateiname und die Datei kann nicht geöffnet werden. Deshalb würde ich zuerst mal die Existens der Datei abfragen, bevor mit TXMLDocument geöffnet wird.
Delphi-Quellcode:
if not FileExists(xmldatei) then
begin // Mitteilung verschicken oder Eintrag in Logdatei ... end; |
Re: TIdHttpServer und XML
Nee, das hilft auch nix.
Leider komme ich erst jetzt dazu, Deinen Tipp auszuprobieren. Der Dateiname beim Öffnen stimmt. Doch das TXMLDocument weigert sich weiterhin beharrlich, die Datei zu öffnen. :?: Ja vielleicht geht das Ganze auch ohne es in eine Datei zu schreiben. So "einfach den Stream ans XML" umleiten. Kennt sich jemand damit aus oder weiss ein gutes Beispiel. :mrgreen: Gruß FrankBrin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 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