Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#] Webservice met ParameterNameSpecified

Pagina: 1
Acties:

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Neem de volgende ASP.NET Webservice method:

C#:
1
2
3
4
5
6
[WebMethod]
public decimal BerekenWaarde(Contractdocument contractdocument)
{
    ...
    return value;
}


Het Contractdocument ziet er dan als volgt uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Contractdocument
{
    private int mWaarde;
    private bool mWaardeSpecified;

    [XmlElement("CD_WAARDE")]
    public int Waarde
    {
        get { return mWaarde; }
        set
        {
            mWaarde = value;
            mWaardeSpecified = true;
        }
    }

    [XmlIgnore]
    public bool WaardeSpecified
    {
        get { return mWaardeSpecified; }
        set { mWaardeSpecified = value; }
    }

}


Ik maak gebruik van XmlElement("CD_WAARDE") omdat het XML bericht aan bepaalde standaarden moet voldoen met cryptische benamingen (voor wie het iets zegt.. het moet voldoen aan de AFD standaard van het SIVI). Ik wil hier in mijn classes liever geen gebruik van maken, dus vandaar de 'vertaalslag' naar XML.

De integer value kan niet nullable zijn, vanwege diezelfde standaarden. Maar ik moet wel weten of de value is meegestuurd of niet. Dus heb ik de extra property 'WaardeSpecified' toegevoegd, die geset wordt zodra het object opgebouwd wordt vanuit het binnenkomende XML bericht.

Oftewel... de XML komt binnen, wordt gedeserialiseerd, de setter van Waarde wordt aangeroepen om de value te setten en daarmee wordt ook gelijk het mWaardeSpecified veld op true gezet zodat ik weet dat dit veld is meegegeven in het binnenkomende XML bericht.

Nu blijkt het zo te zijn dat de aanwezigheid van de WaardeSpecified property er voor zorgt dat Waarde niet meegestuurd wordt in het XML bericht. M.a.w. zodra ik de WaardeSpecified property verwijder, of bijvoorbeeld hernoem naar WaardeGespecificeerd werkt alles wel.

De vraag is nu, waarom heeft de property WaardeSpecified invloed op de manier waarop het request XML bericht opgebouwd wordt, zelfs als deze het attribuut XmlIgnore heeft? Is de toevoeging 'Specified' een oplossing die standaard al door (ASP.NET) webservices gebruikt wordt om aan te geven dat een bepaalde property wel of niet wordt meegestuurd? Override ik de default behavior zeg maar, door deze zelf op te nemen als property in mijn class?

Hier lijkt het namelijk wel op, maar ik kan het niet verklaren en kan er op internet ook niets over terug vinden (tis ook lastig zoeken op het keyword 'Specified'...)

Kan iemand mij vertellen hoe dit in elkaar steekt en waarom een VeldNaamSpecified property invloed heeft op de werking van de VeldNaam property ?

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

En wat gebeurt er als je een tweede property met suffix 'Specified' aanmaakt en daarop teven een XmlElement attribute zet? Komt deze dan ook niet terug? Als deze nu wel terug komt, maak dan een derde property aan maar dan zonder de suffix 'Specified' en verplaats het XmlElement attribute.

Vanwege mijn mogelijke 'wartaal': even in code:
test 1:
C#:
1
2
[XmlElement]
public bool TestSpecified { get { return true; } }


test 2:
C#:
1
2
3
4
5
[XmlElement]
public int Test { get { return 42; } }

[XmlIgnore]
public bool TestSpecified { get { return true; } }

If it isn't broken, fix it until it is..


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Test1: Dit heeft als effect dat WaardeSpecified ook in het XML bericht meegestuurd wordt. Maar met de default waarde 'false' hetgeen er weer voor zorgt dat Waarde niet meegestuurd wordt...

Test2: Die snap ik niet helemaal... volgens mij is dat de situatie die ik nu heb.. dus de property Waarde als XmlElement en de WaardeSpecified op XmlIgnore.

  • Sikkek
  • Registratie: Maart 2004
  • Laatst online: 16-11 14:11
Dit is by design. De property VeldnaamSpecified bepaalt of Veldnaam geserialiseerd wordt.

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Sikkek schreef op donderdag 21 augustus 2008 @ 16:05:
Dit is by design. De property VeldnaamSpecified bepaalt of Veldnaam geserialiseerd wordt.
D'oh !

M.a.w. ik kan dit niet gebruiken om te achterhalen of een property daadwerkelijk meegestuurd is met de XML zoals in het bovenstaande voorbeeld...

Bedankt voor de opheldering ;)

Iemand die ditzelfde probleem op een andere manier oplost ? Dus achteraf (in het object) kunnen controleren of een integer de waarde 0 heeft omdat 'ie nou eenmaal niet nullable is... of de waarde 0 heeft omdat 'ie expliciet is meegestuurd in het XML bericht?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het specified verhaal is toevallig pas nog langs geweest. \[C#] DefaultValueAttribute voor optionele Guid

Het is imho niet makkelijk mogenlijk om te controleren of het nou gewoon de default waarde is of dat hij meegestuurd is. Je zou eventueel in de property bij kunnen houden of hij een keer geset is, maar echt elegant is het niet.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1