Laden...

WSDL minOccurs/maxOccurs ändern

Erstellt von bernett vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.682 Views
B
bernett Themenstarter:in
53 Beiträge seit 2006
vor 15 Jahren
WSDL minOccurs/maxOccurs ändern

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:

WSDL unvollständig

bereits erwähnt, wird wohl ein String automatisch als optioneal (minOccurs="0") gekennzeichnet. Wie kann ich dieses Verhalten ändern?

Hier:
http://stackoverflow.com/questions/154554/minoccurs0-on-required-parameters-in-wsdl-on-aspnet-web-service

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

G
497 Beiträge seit 2006
vor 15 Jahren

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

B
bernett Themenstarter:in
53 Beiträge seit 2006
vor 15 Jahren

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

G
497 Beiträge seit 2006
vor 15 Jahren

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.

S
8.746 Beiträge seit 2005
vor 15 Jahren

Grundsätzlich solltest du darüber nachdenken auf WCF umzusteigen. Du hast hier viel mehr Kontrolle.

B
bernett Themenstarter:in
53 Beiträge seit 2006
vor 15 Jahren

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