Toon posts:

[C#] Collection doorgeven aan webservice

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil een collection doorgeven aan een webservice, maar nu vraagt de webservice telkens om een array van integers. Ik zal het probleem stap voor stap uitleggen:

Het eerste stuk code bevat de webmethod, die dus in de webservice staat. De body heb ik niet meegegeven, maar het gaat erom dat op basis van een verzameling personeelsnummers personen worden opgehaald. (De NrCollection is gemaakt op basis van een CollectionBase). Deze NrCollection is later nog belangrijk

C#:
1
2
3
4
[WebMethod]
public Personen GetPersonenByNrs(NrCollection PersNrs)
{
}



Het tweede stuk code is de aanroep vanuit een applicatie die de webmethod aanspreekt:

C#:
1
2
3
4
5
6
7
8
9
10
PersWebservice wsPers = new PersWebservice();

NrCollection PersNrs =
   new NrCollection();

PersNrs.Add(2207667);
PersNrs.Add(2487058);

PersObj[] personen =
   wsPers.GetPersonenByNrs(PersNrs);


Hierin is dus te zien dat ik de webmethod aanspreek en de juiste verzameling doorgeef, van het type NrCollection, precies zoals de webmethod verwacht.


En nu komt het gekke stuk code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
[System.Web.Services.Protocols.SoapDocumentMethodAttribute
("http://tempuri.org/GetGoederenByIDs", RequestNamespace="http://tempuri.org/",
ResponseNamespace="http://tempuri.org/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public PersObj[] GetPersonenByNrs(int[] PersNrs)
{
   object[] results = this.Invoke(
      "GetPersonenByNrs",
      new object[] { PersNrs } ) ;

   return ((PersObj[])(results[0]));
}


Hierboven is te zien dat in het door WSDL gegereneerde stuk code een int[] wordt verwacht ( public PersObj[] GetPersonenByNrs(int[] PersNrs) ) . Dit moet natuurlijk een NrCollection zijn. Maar dat is niet zo en daarom werkt dit stuk code ook niet.
Waarom wordt er een int[] gegenereerd en geen NrCollection, terwijl als ik dat handmatig aanpas, dan werkt alles wel goed.

Hoe kan ik ervoor zorgen dat WSDL snapt dat ik een NrCollection gebruik en geen int[] ?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Als je NrCollection een "alias" is voor een int[], dan kun je in WSDL geen verschil aangeven. Sowieso lijkt het me vrijwel onmogelijk om een nonstandaard class in WSDL te zetten, want hoe zou een java- of andere client dat moeten kennen? Ik heb het ook weleens geprobeerd, maar ik heb ergens gelezen dat je de parameters/returns van een webmethode moet zien als pure data, en niet als business classes. Wat dat betreft is int[] dus wel goed.

Als ik jou was zou ik in NrCollection gewoon een operator opnemen waardoor ie zich impliciet vanuit int[] laat casten:
C#:
1
2
3
public static implicit operator NrCollection(int[] source) {
   //...
}


En dan voor als je een NrCollection aan een webmethode wil géven, dan de omgekeerde operator. Maar maak deze operator *alleen* implicit als er bij de conversie geen gegevens verloren gaan, om vergissingen te voorkomen:
C#:
1
2
3
public static implicit operator int[](NrCollection source) {
   //...
}

[ Voor 24% gewijzigd door _Thanatos_ op 09-03-2006 14:07 ]

日本!🎌