Веб-служба ASMX - возвращает пользовательский класс со свойствами - PullRequest
5 голосов
/ 01 октября 2010

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

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

Ответы [ 2 ]

6 голосов
/ 01 октября 2010

Это будет работать, только если класс сериализуем, что обычно означает открытые поля и свойства, поэтому ваш MenuItem не будет работать, потому что ваша сторона client не знает, как правильно построить класс MenuItem.Попробуйте это:

[Serializable]
public class MenuItem
{
   private string name;

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

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

}
0 голосов
/ 01 октября 2010
  1. частные свойства не отправляются клиенту, если я правильно помню.
  2. Методы не могут быть сгенерированы на клиенте.Каким методом используются некоторые ресурсы на сервере?2а.Чтобы обойти это, вы можете использовать частичные классы для переопределения некоторых методов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...