Невозможно разобрать список в WCF - PullRequest
1 голос
/ 22 апреля 2019

Я не могу получить список в моей конечной точке 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.

1 Ответ

1 голос
/ 23 апреля 2019

Вы не можете прочитать эту полезную нагрузку XML с помощью сериализатора DataContract.

Во-первых, переключите службу WCF на использование XmlSerializer :

[ServiceContract]
[XmlSerializerFormat]
public class WcfService
{
    [OperationContract]
    public void TheOperation(Carro carro)
    {
        // do what you need to do
    }
}

Теперь используйте Datacontract, который использует атрибуты Xml для управления его сериализацией :

[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>

, что соответствует нашему ожидаемому вводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...