Neem de volgende ASP.NET Webservice method:
Het Contractdocument ziet er dan als volgt uit:
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 ?
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 ?