classe definita dall'utente ritorno con proprietà - ASMX Web Service
-
27-09-2019 - |
Domanda
Hey, Sto cercando di restituire una classe definita dall'utente da un metodo web. La classe ha proprietà e / o metodi. Dato il seguente metodo web:
[WebMethod]
public List<MenuItem> GetMenu()
{
List<MenuItem> menuItemList = new List<MenuItem>();
menuItemList.Add(new MenuItem());
menuItemList.Add(new MenuItem());
menuItemList.Add(new MenuItem());
return menuItemList;
}
Ora, suppongo che questo servizio web è consumato con l'aggiunta di un riferimento Web in un'applicazione console di nuova creazione. Il codice seguente viene utilizzato per testarlo:
public void TestGetMenu()
{
MenuService service = new MenuService.MenuService();
service.MenuItem[] menuItemList = service.GetMenu();
for (int i = 0; i < menuItemList.Length; i++)
{
Console.WriteLine(menuItemList[i].name);
}
Console.ReadKey();
}
Prima di tutto, questo non funziona se la classe MenuItem contiene proprietà ... Inoltre, se la classe MenuItem contiene un metodo della chiamata al metodo web non manca, ma il metodo non è nel proxy generato class .. per esempio: menuItemList [i] .getName () non esiste. Perché? Cosa mi manca?
//This works
public class MenuItem
{
public string name;
public MenuItem()
{
name = "pizza";
}
}
//This crashes / doesnt work
public class MenuItem
{
private string name;
public MenuItem()
{
name = "pizza";
}
public string Name
{
get { return name; }
set { name = value; }
}
}
//This successfully calls web method, but the method does not exist during test
public class MenuItem
{
private string name;
public MenuItem()
{
name = "pizza";
}
public string getName()
{
return name;
}
}
Soluzione
E 'solo lavoro se la classe è serializzabile che di solito significa campi e le proprietà pubbliche, questo è il motivo per cui il vostro MenuItem non riuscirà perché il vostro lato client
non ha idea di come costruire la classe MenuItem correttamente.
Prova questo:
[Serializable]
public class MenuItem
{
private string name;
public MenuItem()
{
name = "pizza";
}
public string Name
{
get {
return name;
}
set {
name = value;
}
}
}
Altri suggerimenti
- proprietà private non vengono inviati al cliente se ricordo bene.
- I metodi non può essere generato sul client. Che cosa è un metodo utilizzato alcune risorse sul server? 2a. Per ovviare a questo, è possibile utilizzare le classi parziali reimplementare alcuni dei metodi.