我无法在WCF端点中接收列表。
这是我的XML文件。我无法编辑这个结构
<wcf:Carro>
<wcf:Fabricante>
<wcf:Fabricante>
<wcf:Id>
<wcf:Id>0001</wcf:Id>
</wcf:Gid>
</wcf:Fabricante>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
</wcf:Carro>
这是我的班级:
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace WCFService
{
[DataContract(Namespace = "http://mywcfservice.com/webservice")]
public class Carro
{
[DataMember(Order = 1)]
public Marca Marca { get; set; }
[DataMember(Order = 2)]
public Acessorio[] Acessorio { get; set; }
}
}
关于Fabricante的信息我收到了,但“Acessorio”列表中没有。
我究竟做错了什么 ?
编辑:我做了一些调整。
注意:如果我包含一个新节点wcf:Acessorio并且在这个节点内我放了其他wcf:Acessorio然后工作。但我无法改变XML结构。
您无法使用DataContract序列化程序读取该XML有效内容。
首先,切换您的WCF服务以使用XmlSerializer:
[ServiceContract]
[XmlSerializerFormat]
public class WcfService
{
[OperationContract]
public void TheOperation(Carro carro)
{
// do what you need to do
}
}
现在使用一个使用XmlAttributes控制其serialization的datacontract:
[XmlRoot(ElementName="Carro", Namespace="wcf")]
public class Carro
{
[XmlElement]
public Fabricante Fabricante { get; set; }
[XmlElement]
public List<Acessorio> Acessorio { get; set; }
}
要验证此类是否有效,我在LinqPad中使用了以下测试装备:
var xml=@"<wcf:Carro xmlns:wcf=""wcf"">
<wcf:Fabricante>
<wcf:Id>0001</wcf:Id>
</wcf:Fabricante>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
<wcf:Acessorio>
<wcf:Descrição>Test</wcf:Descrição>
</wcf:Acessorio>
</wcf:Carro>";
var obj = new Carro {
Fabricante = new Fabricante { Id ="0001"},
Acessorio = new List<Acessorio> {
new Acessorio{ Descrição = "1"},
new Acessorio{ Descrição = "2"} }
};
var xs = new XmlSerializer(typeof(Carro));
using(var ms = new MemoryStream())
{
using(var xw = XmlWriter.Create(ms, new XmlWriterSettings {Indent = true, OmitXmlDeclaration = true}))
xs.Serialize(xw, obj);
Encoding.UTF8.GetString(ms.ToArray()).Dump("serialized result");
var o = (Carro) xs.Deserialize(XmlReader.Create(new StringReader(xml)));
o.Dump("deserialized result");
}
序列化结果的结果是:
<Carro xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="wcf">
<Fabricante>
<Id>0001</Id>
</Fabricante>
<Acessorio>
<Descrição>1</Descrição>
</Acessorio>
<Acessorio>
<Descrição>2</Descrição>
</Acessorio>
</Carro>
这符合我们的预期输入。