Пользовательский объект WCF возвращается правильно, кроме возврата пустых списков - PullRequest
1 голос
/ 04 мая 2011

Я отправляю XML на мой веб-сервис и получаю метод:

public XElement SubmitRecipe(Recipe recipe)

Параметр recipe корректно получает все свойства, но recipe.Allergies имеет счетчик 0, кто-нибудь знает почему?

Пример XML-файла:

<Recipe>
<Allergies>
    <Allergy>nuts</Allergy>
    <Allergy>wheat</Allergy>
</Allergies>
<Title>recipe title</Title>
<Id>107</Id>
</Recipe

Объект Recipe:

[CollectionDataContract(Name = "Allergies", ItemName = "Allergy")]
public class AllergyList : List<string> { }

[DataContract]
public class Recipe
{        
    [DataMember(Name = "Allergies")]
    public AllergyList Allergies { get; set; }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Title { get; set; }
}

В моем тесте метода создания я получаю то, что ожидаю:

public Recipe GetRecipe()
{
    Recipe recipe = new Recipe();

    recipe.Id = 1;
    recipe.Allergies = new AllergyList();
    recipe.Allergies.Add("nuts");
    recipe.Allergies.Add("wheat");
}

<Recipe>
    <Allergies>
        <a:Allergy>nuts</a:Allergy>
        <a:Allergy>wheat</a:Allergy>
    </Allergies>
    <Id>1</Id>
</Recipe>

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

У вас может быть проблема с пространством имен XML ( не .NET name) с вашими контрактами на обслуживание.Тестовый пример, который вы показываете, имеет элемент "a: Allery" для ссылки на элементы коллекции.Хотя образец XML не содержит псевдоним пространства имен XML «a:».Я почти всегда устанавливаю пространство имен для всех контрактов на обслуживание, эксплуатацию и передачу данных.Да, это может быть утомительно, но выгода в том, что у вас не возникнет проблем с пространством имен XML, и это определенно поможет с версией контракта данных в будущем.Вот как будет выглядеть ваш контракт:

[CollectionDataContract(Name = "Allergies", ItemName = "Allergy",
    Namespace="http://yourorg.co.uk/2011/05/Medical")]
public class AllergyList : List<string> { }

[DataContract(Namespace="http://yourorg.co.uk/2011/05/Medical")]
public class Recipe
{        
    [DataMember(Name = "Allergies")]
    public AllergyList Allergies { get; set; }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Title { get; set; }
}
0 голосов
/ 05 мая 2011

Проверьте, что происходит по сети, с помощью Fiddler (или чего-то подобного) и сравните, создав экземпляры ваших типов и сериализовав их в файл (например) с помощью DataContractSerializer (пример здесь ). Вывод файла покажет, что ожидает сериализатор, и вы можете увидеть любые различия с тем, что ваш клиент отправляет с тем, что было зарегистрировано в Fiddler - например, различия пространства имен

Другой вариант - использовать другой клиент, где вы можете вручную установить XML (например, soapUI).

...