Веб-служба С# возвращает вложенные пользовательские объекты

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

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

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

[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... нет определения для встроенных типов, поэтому я всегда получаю null на стороне клиента.

XmlElement , XmlInclude , [Serializable] видимо не действуют...

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

Спасибо


person Learner    schedule 11.11.2009    source источник
comment
Я мог видеть, что после того, как я изменил все частные поля на общедоступные, это сработало... Но почему общедоступные свойства не сериализуются, если они ссылаются на частные поля?   -  person Learner    schedule 11.11.2009


Ответы (2)


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

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

person jvenema    schedule 11.11.2009
comment
Большое спасибо за ваше ценное предложение. Что-то мне подсказывает, что вы правы насчет сеттера :). Посмотрим (5 мин). Спасибо - person Learner; 11.11.2009

Возможно, вам не хватает атрибута XmlRoot на вашем Класс действия человека. XmlInclude также может быть ненужным.

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

  • Я использую (в своих веб-службах ASMX/.NET 2.0) XmlRoot и не использую XmlInclude.
  • Я заметил одну странную вещь: ваши свойства доступны только для чтения. Я считаю, что соглашение заключается в том, чтобы установить свойства хранения данных в сериализуемых классах.
  • еще одна вещь, которую вы можете попробовать, - это взять WSDL вашего сервиса, запустить его с помощью утилиты WSDL, посмотреть, как wsdl.exe генерирует ваши сериализуемые классы, и увидеть различия - это, конечно, совет для .NET 2.0/ASMX.
person azheglov    schedule 11.11.2009
comment
Большое спасибо за ваш быстрый ответ ... Я мог видеть, что после того, как я изменил все частные поля на общедоступные, это сработало ... Но почему общедоступные свойства не сериализуются, если они ссылаются на частные поля? - person Learner; 11.11.2009
comment
Да, проблема заключалась в сеттере, как и предположил jvenema. Большое Вам спасибо - person Learner; 11.11.2009