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;  
    }  
}
Foi útil?

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

  1. As propriedades privadas não são enviadas ao cliente, se bem me lembro.
  2. 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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top