ASMX Web Service - Вернуть пользовательский класс со свойствами

StackOverflow https://stackoverflow.com/questions/3839637

Вопрос

Эй, я пытаюсь вернуть пользовательский класс из веб-метода. Класс имеет свойства и / или методы. Учитывая следующий веб-метод:

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

Теперь предположим, что эта веб-сервис потребляется путем добавления веб-справки в недавно созданном приложении консоли. Следующий код используется для тестирования его:

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

Прежде всего, это не работает, если класс Menuitem содержит свойства ... Кроме того, если класс Menuitem содержит метод, вызов на веб-метод не выполнен, но метод не находится в сгенерированном классе прокси. Например: Menuitemlist [i] .getname () не существует. Почему? Что мне не хватает?

//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;  
    }  
}
Это было полезно?

Решение

Он будет работать только в том случае, если класс сериализуется, который обычно означает публичные поля и свойства, именно поэтому ваш Menuitem потерпит неудачу, потому что ваш client Сторона не имеет идеи, как правильно построить класс меню.

Попробуй это:

[Serializable]
public class MenuItem
{
   private string name;

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

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

}

Другие советы

  1. Частные свойства не отправляются клиенту, если я помню правильно.
  2. Методы не могут быть сгенерированы на клиенте. Какой метод использовал некоторые ресурсы на сервере? 2А. Работать вокруг этого, вы можете использовать частичные классы для переоборудования некоторых методов.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top