Autor Beitrag
KGriess
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.03.10 00:38 
Moin,

ich würde gern die XML-Daten eines SOAP-Requests/-Response per Socket-Verbindung übertragen. Die WSDL-Import-Unit habe ich. Was ich nun brauche ist eine Möglichkeit aus einer SOAP-Klasse das XML-Objekt zu extrahieren um dessen Inhalt (XML_Dokument.XML.Text) per Socket zu versenden.

In den SOAP-Units habe ich hierzu die Funktionen ObjectToSOAP(...) und SOAPToObject(...) gefunden. Bei den beiden Aufrufen kommt ein Interface vom Typ IObjConverter zum Einsatz und hier komme ich nicht weiter wo bekomme ich das her?

Weiß jemand von Euch einen Beispiel-Source oder eine andere Möglichkeit


Vielen Dank schon mal vorweg,
KGriess
KGriess Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 12.03.10 15:48 
Hallo Zusammen,

hab die Lösung gefunden. Ich beschränke mich mal auf das OnClientRead Events des ServerSockets:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
// Meldung vom Client empfangen
procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
   s: String;
   HttpRio:      THTTPRIO;
   service:      TMeinSoapServiceObject;  //Aus dem Importiert WSDL-File
   request:      TMeinSoapRequestObjekt;  //Aus dem Importiert WSDL-File
   response:     TMeinSoapResponseObject; //Aus dem Importiert WSDL-File
   ResponseName: String;
   XmlDocument:  TXMLDocument;
   RootNode:     IXMLNode;
   ResponseNode: IXMLNode;
   RequestNode:  IXMLNode;
   RefID:        WideString;
begin
   s := Socket.ReceiveText;

   HttpRio     := THTTPRIO.Create(Self);
   service     := Get_TMeinSoapServiceObject(false, '', HttpRio);
   XmlDocument := TXmlDocument.Create(Self);

   // Hier wird die SOAP-Anfrage ausgewertet
   try
      XmlDocument.XML.Text := s;
      XmlDocument.Active   := true;
      RootNode             := XmlDocument.ChildNodes[0];
      RequestNode          := XmlDocument.DocumentElement;

      // Leeres SOAP-Objekt erzeugen
      request := TMeinSoapRequestObjekt.Create;

      // Hier wird aus der SOAP-Abfrage heraus das Objekt erzeugt
      request.SOAPToObject(RootNode, RequestNode, HttpRio.Converter);
   finally
      FreeAndNil(XmlDocument);
   end;


   //...


   // XML-Dokument vorbereiten in das die SOAP-Antwort eingetragen wird
   XmlDocument  := TXmlDocument.Create(Self);
   ResponseName := TMeinSoapResponseName';    //Name des SoapObjekts aus dem WSDL-File

   // Hier wird die Antwort erzeugt
   try
      XmlDocument.Active         := true;
      RootNode                   := XmlDocument.AddChild(ResponseName);
      response                   := TMeinSoapResponseObject.Create;
      response.Property1         := '
Prop 1';
      response.Property2         := '
Prop 2';
      response.Property3         := '
Prop 3';

      // Hier wird über das Objekt die Soap-Abfrage generiert
      ResponseNode := response.ObjectToSOAP(
                         RootNode, 
                         RootNode, 
                         HttpRio.Converter,
                         ResponseName, 
                         '
URI',          // Soap-Namespace
                         [],             // Converter-Optionen
                         RefID
                      );

      //Antworten
      Socket.SendText(ResponseNode.XML);
      Socket.Write(0);
   finally
      //HttpRio.Free;
      FreeAndNil(XmlDocument);
   end;
end;