Mehr Dynamik bei Webservice?



  • Moins

    Ich habe eine Frage bzw. ein Verständnis Problem...

    Ich habe ein WSDL und muss nun einen Server Programmieren welchem
    diesem WSDL entspricht. Soweit so gut.

    Wie ich gelesen habe müsste ich Objekte (struct) erstellen, welche
    den Strukturen des WSDL gleichkommen und diese als Parameter/Rückgabewert
    setzen. z.B.:

    // ... cut ... //
    [WebMethod]
            public myObjReturnHelloWorld HelloWorld(myObjParamHelloWorld data)
            {
                // ... mache was du machen willst ... //
            }
    

    Nun, Laut WSDL (xsd) wird das XML welches ich als Parameter bekommen sollte
    hat aber auch Attribute, welche ich mit dieser Art nicht Abdecken kann.
    Zumal widerstrebt es mir dynamisches XML in statische Strukturen abzubilden.

    Wie soll ich so etwas in einem Objekt Abbilden:

    <testInfo>
     <gewicht me="kg">15</gewicht>
     <zeit me="az">34.5</zeit>
     <name>Haleon</name>
    </testInfo>
    

    Wie ich an die Cdaten kommen verstehe ich ja noch, aber die Attribute gehen
    verloren.

    Nach etwas suchen habe ich scheinbar die Lösung gefunden: xmlDocument.
    Mein Test sieht etwa so aus:

    [WebMethod]
            public System.Xml.XmlDocument vergleicheZweige(System.Xml.XmlDocument xmlDaten)
            {
                System.Xml.XmlDocument xmlRet = new XmlDocument();
    
                string name     = (xmlDaten.GetElementById("name")).Value;
                string vorname  = (xmlDaten.GetElementById("vorname")).Value;
    
                string result   = "false";
                if (name == vorname) {
                    result      = "true";
                }
    
                xmlRet.LoadXml("<antwort>" + result + "</antwort>");
    
                return xmlRet;
            }
    

    Schon voller Vorfreude habe ich den Test generiert und gestartet, das Ergebnis war ernüchternd:

    POST /Service1.asmx HTTP/1.1
    Host: localhost
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/vergleicheZweige"
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <vergleicheZweige xmlns="http://tempuri.org/">
          <xmlDaten>xml</xmlDaten>
        </vergleicheZweige>
      </soap:Body>
    </soap:Envelope>
    
    HTTP/1.1 200 OK
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <vergleicheZweigeResponse xmlns="http://tempuri.org/">
          <vergleicheZweigeResult>xml</vergleicheZweigeResult>
        </vergleicheZweigeResponse>
      </soap:Body>
    </soap:Envelope>
    

    Dementsprechend war auch das WSDL. Anstelle der XML struktur nahm er einfach
    xmlDaten (Name des Parameters). Was aber nicht meiner Vorgabe (des Clients) entspricht. Somit würden wohl Server und Client aneinander vorbei reden.

    Ich könnte nun versuchen etwas zu basteln, da ich ja nun weiss das er
    den Namen des Parameters verwendet. Wie kann man diese Automatismus abschalten?

    Wie löst man so etwas am besten? Könnte man nicht eine xsd Schema als Rückgabe
    oder Parameter definieren?

    Gruss
    Ghost


Anmelden zum Antworten