Serviço da Web ASMX - Retornar classe definida pelo usuário com propriedades
-
27-09-2019 - |
Pergunta
Ei, estou tentando retornar uma classe definida pelo usuário de um método da Web. A classe possui propriedades e/ou métodos. Dado o seguinte método da 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;
}
Agora, suponha que este serviço da Web seja consumido adicionando uma referência da Web em um aplicativo de console recém -criado. O código a seguir é usado para testá -lo:
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();
}
Primeiro de tudo, isso não funciona se a classe Menuitem contiver propriedades ... Além disso, se a classe Menuitem contiver um método que a chamada para o método da Web não falha, mas o método não está na classe de proxy gerada. Por exemplo: Menuitemlist [i] .getName () não existe. Por quê? O que estou perdendo?
//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;
}
}
Solução
Só funcionará se a classe for serializável, o que geralmente significa campos e propriedades públicas, é por isso que seu menuitem falhará porque seu client
O lado não tem idéia de como construir a classe Menuitem corretamente.
Experimente isso:
[Serializable]
public class MenuItem
{
private string name;
public MenuItem()
{
name = "pizza";
}
public string Name
{
get {
return name;
}
set {
name = value;
}
}
}
Outras dicas
- As propriedades privadas não são enviadas ao cliente, se bem me lembro.
- Os métodos não podem ser gerados no cliente. O que é um método usado alguns recursos no servidor? 2a. Para contornar isso, você pode usar classes parciais para reimplementar alguns dos métodos.