C # веб-сервис ... вернуть вложенные пользовательские объекты - PullRequest
1 голос
/ 11 ноября 2009

Я начал разработку нового веб-сервиса в VS2005. Есть только один метод:

[WebMethod]  
[XmlInclude(typeof(Person))]  
public PersonAction GetAction()  
{  
   PersonAction action = new PersonAction();  
   return action;  
}  

где PersonAction class содержит поле со ссылкой на Person class

[Serializable]  
public class PersonAction    
{  
    private string actionName = "XAction";  
    private Person person1;  
    private Person person2;  

    public PersonAction() 
    {
        this.person = new Person();
        this.person.Name = "P1";
    }

    public string Name
    {
        get
        {
            return this.actionName;
        }
    }
    [XmlElement(Type = typeof(Person))]
    public Person Person1
    {
        get
        {
            return this.person1;
        }
    }
}  

Я его собрал, запустил ... но в wsdl он всегда содержит пустой тег для PersonAction ... нет определения встроенных типов, поэтому на стороне клиента я всегда получаю ноль. *

XmlElement, XmlInclude, [Serializable] явно не имеют эффекта ...

Я уверен, что что-то упустил.
Наверняка кто-то сталкивался с этой проблемой в прошлом и знает решение. Я был бы очень признателен за любой кусок кода для VS2005 (.NET 2.0), который помог бы.

Спасибо

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Ваше изменение, которое делает переменные общедоступными, похоже, исправляет это, но на самом деле это не так. Служба теперь сериализует открытую переменную, а не свойства.

Попробуйте изменить переменные обратно на private, а также добавить функцию "setter". Я считаю, что это требуется для сериализации.

0 голосов
/ 11 ноября 2009

Возможно, вам не хватает атрибута XmlRoot в вашем классе Person Action. XmlInclude также может быть ненужным.

Отредактировано, чтобы добавить:

  • Я использую (в моих веб-службах ASMX / .NET 2.0) XmlRoot и не использую XmlInclude.
  • Я заметил одну странную вещь: ваши свойства только для получения. Я полагаю, что соглашение заключается в том, чтобы сделать свойства хранения данных в сериализуемых классах get-set.
  • еще одна вещь, которую вы можете попробовать, это взять WSDL вашего сервиса, запустить его через утилиту WSDL, посмотреть, как wsdl.exe генерирует ваши сериализуемые классы, и увидеть различия - это, конечно, совет для .NET 2.0 / ASMX .
...