Toon posts:

[C# .NET] WebMethod returns ArrayList

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hi ik ben bezig om een webservice op te zetten in C# .NET omgeving. Nu heb ik in de webservice een functie geschreven die een ArrayList. Echter het geval is dat als ik deze in mijn client applicatie oproep dat ik een Object terug krijg in plaats van een ArrayList! }:O

Tijdens de search heb ik niks kunnen vinden over WebMethods in C# .NET. De zoek toch in google geeft wel een aantal resultaten. Echter bij de voorbeelden die ik vind staat alleen de WebMethode beschreven terwijl het mij om zowel de functie in de client applicatie.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[XmlInclude(typeof(UnitHandling))]
[XmlInclude(typeof(ArrayList))]
[WebMethod]
//public function that returns a ArrayList
public ArrayList GetUnitFromDB(int UserID)
{
 
 UnitHandling Unit = new UnitHandling();
 ArrayList Units = new ArrayList();

  try
 {              
  string query = "Select * FROM Unittable WHERE UserID='" + UserID +"'";
  MakeConnection(query);    
                
 SqlDataReader SqlReturnedData = SqlCmd.ExecuteReader();

 while(SqlReturnedData.Read())
 {
  Unit.doID = SqlReturnedData.GetInt32(0);
  Unit.doParentID = SqlReturnedData.GetInt32(1);
  Unit.doHP = SqlReturnedData.GetInt32(2);
  Unit.doAttack = SqlReturnedData.GetInt32(3);
  Unit.doDefence = SqlReturnedData.GetInt32(4);
  Unit.doX = SqlReturnedData.GetInt32(5);
  Unit.doY = SqlReturnedData.GetInt32(6);
  Unit.doSquad = SqlReturnedData.GetInt32(7);
  Unit.doComment = SqlReturnedData.GetString(8);
  //Voeg Unit toe aan Unit Array
  Units.Add(Unit);
  }
  SqlReturnedData.Close();
  SqlConn.Close();
  return Units;
 }
 catch (Exception ex)
 {
  throw new Exception(ex.Message);
 }
}


De XML die ik van de web applicatie terug krijg!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8" ?> 
- <ArrayOfAnyType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
- <anyType xsi:type="UnitHandling">
  <doID>2</doID> 
  <doParentID>0</doParentID> 
  <doHP>100</doHP> 
  <doAttack>25</doAttack> 
  <doDefence>75</doDefence> 
  <doX>1</doX> 
  <doY>1</doY> 
  <doSquad>1</doSquad> 
  <doComment>User 1</doComment> 
  </anyType>
- <anyType xsi:type="UnitHandling">
  <doID>2</doID> 
  <doParentID>0</doParentID> 
  <doHP>100</doHP> 
  <doAttack>25</doAttack> 
  <doDefence>75</doDefence> 
  <doX>1</doX> 
  <doY>1</doY> 
  <doSquad>1</doSquad> 
  <doComment>User 1</doComment> 
  </anyType>
  </ArrayOfAnyType>


Weet iemand hoe je een webmethode exact moet declareren om een ArrayList terug te krijgen. Zodra ik een ArrayList terug krijg kan ik hem afhandelen.

Ik hoop dat jullie me kunnen helpen

Alvast Bedankt

  • whoami
  • Registratie: December 2000
  • Nu online
Een ArrayList is ook een object.
Je zou hetgeen je terugkrijgt in je client-applicatie kunnen casten naar een arraylist.
code:
1
ArrayList blaat = (ArrayList)MyWebservice.GetArrayList();


Daarnaast nog een tip ivm je query:
maak gebruik van parametrized queries

[ Voor 31% gewijzigd door whoami op 18-11-2003 10:10 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 18 november 2003 @ 10:08:
Een ArrayList is ook een object.
Je zou hetgeen je terugkrijgt in je client-applicatie kunnen casten naar een arraylist.
code:
1
ArrayList blaat = (ArrayList)MyWebservice.GetArrayList();


Daarnaast nog een tip ivm je query:
maak gebruik van parametrized queries
Dat dacht ik ook dat heb ik al geprobeerd alleen krijg ik dan de volgende error:

Cannot convert type 'object[]' to 'System.Collections.ArrayList' }:O

  • whoami
  • Registratie: December 2000
  • Nu online
Ik vermoed dat het hem hier in zal zitten:
Even though each of these XML Web service methods are defined in ASP.NET using a method of a class, it is important to realize that the data that is eventually communicated over the network must be serialized into XML. As such, it is important to remember that XML Web services are not a replacement for DCOM, but rather a messaging infrastructure for communicating across platforms using industry standards
Je arraylist moet dus geserialized worden naar een XML formaat. Die arraylist wordt dus geserialized, maar je client applicatie zal niet weten dat het om een arraylist gaat, maar denkt dat het een gewone array is. (Een arraylist maakt intern gebruik van een gewone array).
Misschien kan je eens met de SoapExtensions spelen, en daar zelf gaan specifieren hoe je Arraylist geserialized en gedeserialized moet worden.
Anderszijds kan je overwegen om een DataTable te returnen ipv een ArrayList.

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
XmlSerializer is buggy, die kan alleen primitive types serializen en datasets. ArrayList is geen primitive type, wordt aangezien voor Dataset(!) en komt dan niet goed aan bij de client. Je zou kunnen proberen via het specificeren van een 'known type' op de webmethod zodat de xmlserializer weet wat voor type hij verwachten kan, maar dit levert wel een 'redefine' op van ArrayList op de client wanneer je visual studio.net gebruikt. (dus automatisch een reference aanmaakt naar de webservice)

Gebruik remoting ipv webservices, je client is immers ook .NET (anders heb je geen reet aan 'ArrayList' :)).

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Nu online
Gebruik maken van remoting is idd ook een optie en normaal gezien ook sneller dan webservices.
Het mogelijke probleem bij remoting is wel dat (als je tcp-channels gebruikt -wat wel nodig is afaik als je de XmlSerializer niet wilt gebruiken) de kans bestaat dat je niet door firewalls geraakt.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Aangezien ik vast zit aan een webservice zal ik maar kiezen om datatables over te sturen. Dit lijkt me dan nog de meest duidelijke methode om mee verder te gaan.

I'll let you know if it works thxs :)

Verwijderd

Verwijderd schreef op 18 november 2003 @ 10:19:
[...]


Dat dacht ik ook dat heb ik al geprobeerd alleen krijg ik dan de volgende error:

Cannot convert type 'object[]' to 'System.Collections.ArrayList' }:O
Je ArrayList wordt blijkbaar als Array gezien aan de client-side. De Xml Serializer die in .NET voor Web Services wordt gebruikt ziet alle klassen die de interface ICollection implementeren als een Array.

Je zou voor je probleem de volgende oplossingen kunnen gebruiken:

MySerializableClass[] myData = (MySerializableClass[]) remoteObj.getArrayList();
ArrayList al = new ArrayList(myData);
Pagina: 1