2011-05-04 124 views
1

我发送XML到我的互联网服务和接收方法是:WCF自定义对象返回正确距返回空列表

public XElement SubmitRecipe(Recipe recipe) 

配方参数正确地接收到所有的属性,但recipe.Allergies具有计数0,有谁知道为什么?

示例XML文件:

<Recipe> 
<Allergies> 
    <Allergy>nuts</Allergy> 
    <Allergy>wheat</Allergy> 
</Allergies> 
<Title>recipe title</Title> 
<Id>107</Id> 
</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

你可能有一个XML命名空间(不是 .NET名称空间)与您的服务有关的问题racts。您显示的测试示例具有“a:Allery”元素来指代收集项目。虽然示例XML不包含“a:”XML命名空间别名。我几乎总是为所有服务,操作和数据合同设置命名空间。是的,这样做可能很乏味,但是回报是你不会有任何XML命名空间问题,并且它肯定会在路上出现help with data contract versioning。这里是你的合同将是什么样子:

[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

检查什么跨使用Fiddler(或类似的东西)线路的过程,并通过创建类型的实例,并与DataContractSerializer的序列化他们的文件(例如)比较(示例here)。文件输出将显示序列化程序所期望的内容,并且您可以看到客户端发送的内容与Fiddler中记录的内容的差异 - 例如,命名空间差异

另一种选择是使用不同的客户端,您可以在其中手动设置XML(例如soapUI)。