Frage

Hey, Ich versuche, eine benutzerdefinierte Klasse von einer beliebigen Web-Methode zurückzukehren. Die Klasse hat Eigenschaften und / oder Methoden. Angesichts der folgenden Web-Methode:

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

Nun nimmt sich diesen Web-Service wird durch das Hinzufügen einer Web-Referenz in einer neu erstellten Konsolenanwendung verbraucht. Der folgende Code wird verwendet, um es zu testen:

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

Vor allem das funktioniert nicht, wenn die MenuItem Klasse Eigenschaften enthält ... Auch wenn die MenuItem Klasse eine Methode enthält der Aufruf an der Web-Methode nicht scheitern, aber das Verfahren ist nicht in der generierten Proxy Klasse .. zum Beispiel: menuItemList [i] .getName () existiert nicht. Warum? Was bin ich?

//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;  
    }  
}
War es hilfreich?

Lösung

Es wird nur funktionieren, wenn die Klasse serialisierbar ist, was bedeutet in der Regel öffentliche Felder und Eigenschaften, deshalb Ihre MenuItem fehl, weil Ihre client Seite keine Ahnung hat, wie man richtig die MenuItem-Klasse zu bauen.

Versuchen Sie diese:

[Serializable]
public class MenuItem
{
   private string name;

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

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

}

Andere Tipps

  1. Private Eigenschaften werden nicht an den Client gesendet, wenn ich mich recht erinnere.
  2. Methoden können nicht auf dem Client generiert werden. Was ist eine Methode, einige Ressourcen auf dem Server verwendet? 2a. Um dies zu umgehen, können Sie partielle Klassen verwenden, um einige der Methoden neu implementieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top