Hallo zusammen,
ich habe mir eine Testanwendung mit Webservices geschrieben. Diese besitzt auch die Methode:
public bool addWorker(int id, string lastname, string firstname, float profit)
in der erzeugten WSDL-Datei werden die Parameter folgendermaßen angezeigt:
<s:element minOccurs="1" maxOccurs="1" name="id" type="s:int"/>
<s:element minOccurs="0" maxOccurs="1" name="nachname" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="vorname" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="profit" type="s:float"/>
Wie hier:
bereits erwähnt, wird wohl ein String automatisch als optioneal (minOccurs="0") gekennzeichnet. Wie kann ich dieses Verhalten ändern?
wird von einem XmlElement(IsNullable = true) Attribut geredet, was jedoch bei mir nicht funktioniert.
Als Alternative hierzu, wie lege ich mir meine WSDL manuell an? Habe bis jetzt nur mit der automatischen Variante gearbeitet.
Grüße,
bernett
ein String kann immer NULL sein. Wenn du das XmlElement-Attribut IsNullable auf true setzt, muss der Client zwar das Element schicken, kann es aber immer noch mit dem xsi:nil-Attribut im Feld als NULL senden.
siehe hier
Hallo,
vielen Dank für die schnelle Antwort. Ich benutze "System.Web.Services".
Ich bemerke gerade, dass ich die Frage etwas verdreht formuliert hatte. Was mich im Prinzip stört ist, dass jegliche Zahlenwerte ein "musthave" sind. Die Id und der Profit lassen sich nicht auf minOccurs="0" ändern. Zumindest nicht mit dem Attribut: XmlElement(IsNullable = true).
Wenn ich das verwende, kompiliert meinen Webservice nicht mehr fehlerfrei.
Methodenkopf:
public bool addWorker(int id, string nachname, string vorname, [XmlElement(IsNullable = true)] float profit)
Browser teilt mir folgendes mit:
Die Ressource kann nicht gefunden werden.
Sobald ich das Attribut entferne geht es wieder.
Grüße,
bernett
du willst, daß zum Beispiel die id als Int optional ist? Dann müsstest du ein Nullable<int> verwenden. Denn Int und Float selbst können nicht NULL sein.
Grundsätzlich solltest du darüber nachdenken auf WCF umzusteigen. Du hast hier viel mehr Kontrolle.
Guten Morgen,
das WCF in der Beziehung mehr Kontrolle bietet glaube ich dir gerne. Jedoch geht es um eine Integration in ein bestehendes System, was schon zum Teil in "System.Web.Services" implementiert wurde. Und für den einen Service bei dem ich umstellen "könnte", möchte ich nun nicht komplett auf ein neues System wechseln. Auch aus Gründen der Wartbarkeit.
@GarlandGreene
Vielen Dank! Genau das habe ich gesucht.
Webmethod:
[WebMethod]
public bool addWorker(int id, string nachname, string vorname, float? profit)
WSDL:
<s:element minOccurs="1" maxOccurs="1" name="id" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="nachname" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="vorname" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="profit" nillable="true" type="s:float" />
Ist schade, dass er hier mit dem "nillable" Attribut arbeitet und nicht mit "minOccurs", aber es funktioniert! 😉
Parsen des Nullable Float Wertes in Float. Sollte natürlich nach Abfrage auf null erfolgen:
float f = float.Parse(profit.Value.ToString());
Weiter Möglichkeit zum Parsen mit Delegate:
http://geekswithblogs.net/michelotti/archive/2006/01/16/66014.aspx
Vielen Dank,
bernett