我将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>
答案 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)。