Forums Neueste Beiträge
 

Mehr Dynamik bei Webservice?

20/08/2009 - 13:16 von Pascal Vizeli | Report spam
Tach

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.:
[cs]
// ... cut ... //
[WebMethod]
public myObjReturnHelloWorld HelloWorld(myObjParamHelloWorld data)
{
// ... mache was du machen willst ... //
}
[/cs]

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:
[code]
<testInfo>
<gewicht me="kg">15</gewicht>
<zeit me="az">34.5</zeit>
<name>Haleon</name>
</testInfo>
[/code]
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:
[cs]
[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;
}
[/cs]

Schon voller Vorfreude habe ich den Test generiert und gestartet, das
Ergebnis war ernüchternd:
[code]
POST /Service1.asmx HTTP/1.1
Host: localhost
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/env...">
<soap:Body>
<vergleicheZweige xmlns="http://tempuri.org/">
<xmlDaten>xml</xmlDaten>
</vergleicheZweige>
</soap:Body>
</soap:Envelope>

HTTP/1.1 200 OK

<?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/env...">
<soap:Body>
<vergleicheZweigeResponse xmlns="http://tempuri.org/">
<vergleicheZweigeResult>xml</vergleicheZweigeResult>
</vergleicheZweigeResponse>
</soap:Body>
</soap:Envelope>
[/code]

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?

Freundliche Grüsse
Pascal
 

Lesen sie die antworten

#1 Günter Prossliner
25/08/2009 - 14:44 | Warnen spam
Hallo Pascal!

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



WSDL làsst viele Varianten zu. Das kann oft ein wenig aufwendig werden das
alles 1:1 hinzubekommen.

Mit VS gibt es ein Tool names "wsdl.exe", welches Dir das grundlegende
Interface für eine Server-Implementierung generieren kann.

z.B.

wsdl /serverInterface test.wsdl

Das generiert dann ein Interface, welches Du entsprechend implementieren
musst. Der Vorteil ist dass die notwendigen Klassen und Attribute generiert
werden. Du musst meist dann nur mehr die Methoden implementieren.

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.



"dynamisch" ist relativ. Bei Web-Services ist es i.d.R. so, dass das Schema
der XML-Dateien spezifiert sind. Dynamik ist u.a. über "xs:any" vorgesehen.

Nach etwas suchen habe ich scheinbar die Lösung gefunden: xmlDocument.



Nein das geht so nicht. Die Parameter und der Returnvalue werden
(de)serialisiert. Das hat mit einem XmlDocument so nichts zu tun.



OK?
mfg GP

Ähnliche fragen