除返回空列表外,WCF自定义对象正确返回

时间:2011-05-04 14:56:47

标签: wcf xml-serialization

我将XML发送到我的webservice,接收方法是:

public XElement SubmitRecipe(Recipe recipe)

配方参数正确接收除食谱之外的所有属性.Alergies的计数为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 个答案:

答案 0 :(得分:2)

您的服务合同可能存在XML命名空间( .NET命名空间)问题。您显示的测试示例具有“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; }
}

答案 1 :(得分:0)

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

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