Question

Hey, Je suis en train de retourner une classe définie par l'utilisateur à partir d'une méthode Web. La classe a des propriétés et / ou des méthodes. Compte tenu de la méthode Web suivant:

[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;  
}

Supposons maintenant que ce service Web est consommé par l'ajout d'une référence web dans une application console nouvellement créée. Le code suivant est utilisé pour tester:

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();  
}  

Tout d'abord, cela ne fonctionne pas si la classe MenuItem contient des propriétés ... En outre, si la classe MenuItem contient une méthode, l'appel à la méthode Web ne manque pas, mais la méthode est pas dans le proxy généré classe .. par exemple: menuItemList [i] .getName () n'existe pas. Pourquoi? Qu'est-ce que je manque?

//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;  
    }  
}
Était-ce utile?

La solution

Il ne fonctionnera que si la classe est sérialisable qui signifie généralement des champs et des biens publics, c'est pourquoi votre MenuItem échouera parce que votre côté client n'a aucune idée de la façon de construire correctement la classe MenuItem.

Essayez ceci:

[Serializable]
public class MenuItem
{
   private string name;

   public MenuItem()
   {
      name = "pizza";
   }

   public string Name
   {
      get {
         return name;
      }
      set {
         name = value;
      }
   }

}

Autres conseils

  1. propriétés privées ne sont pas envoyés au client si je me souviens bien.
  2. Les méthodes ne peuvent être générés sur le client. Ce qui est une méthode utilisée des ressources sur le serveur? 2a. Pour contourner ce problème, vous pouvez utiliser des classes partielles pour ré-écrire quelques-unes des méthodes.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top