Domanda

Hey, Sto cercando di restituire una classe definita dall'utente da un metodo web. La classe ha proprietà e / o metodi. Dato il seguente metodo 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;  
}

Ora, suppongo che questo servizio web è consumato con l'aggiunta di un riferimento Web in un'applicazione console di nuova creazione. Il codice seguente viene utilizzato per testarlo:

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

Prima di tutto, questo non funziona se la classe MenuItem contiene proprietà ... Inoltre, se la classe MenuItem contiene un metodo della chiamata al metodo web non manca, ma il metodo non è nel proxy generato class .. per esempio: menuItemList [i] .getName () non esiste. Perché? Cosa mi manca?

//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;  
    }  
}
È stato utile?

Soluzione

E 'solo lavoro se la classe è serializzabile che di solito significa campi e le proprietà pubbliche, questo è il motivo per cui il vostro MenuItem non riuscirà perché il vostro lato client non ha idea di come costruire la classe MenuItem correttamente.

Prova questo:

[Serializable]
public class MenuItem
{
   private string name;

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

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

}

Altri suggerimenti

  1. proprietà private non vengono inviati al cliente se ricordo bene.
  2. I metodi non può essere generato sul client. Che cosa è un metodo utilizzato alcune risorse sul server? 2a. Per ovviare a questo, è possibile utilizzare le classi parziali reimplementare alcuni dei metodi.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top