none
problema passando xmldocument como retorno de função RRS feed

  • Pergunta

  •  Olá pessoal, blz?

     É o seguinte:

      Estou convertendo uma aplicação que era Web Service pra WCF, até aí tudo bem. Só que quando eu estava convertendo as funções deparei com 1 problema. Tenho uma função que se chama "XmlDocument GetXmlSettings();" que retorna um documento XML, e o WCF diz que não consegue serializar o objeto. Alguém, poderia me ajudar por favor? tem alguma maneira de serializar o objeto?

     

     desde já agradeço.

    segunda-feira, 23 de agosto de 2010 14:06

Respostas

  • Boas Pedro,

    O ASP.NET Web Service consegue fazer uma mágica para lidar com o XmlDocument e persistí-lo, mas isso não quer dizer que na outra ponta você também terá este mesmo objeto. Na verdade, ele será substituído pelo objeto XmlNode.

    O que você faz do outro lado é construir um XmlDocument e carregar o resultado do WebMethod para dentro dele. Se você consumir esse serviço em ASMX em WCF, verá que ele cria contratos de mensagens (http://www.israelaece.com/post/WCF-MessageContracts.aspx) ao invés de reconstruir um XmlDocument.

    No WCF não é diferente. Ele apenas deixa claro que esse objeto não pode serializar o XmlDocument. No caso do WCF, você deve retornar retornar o XmlElement, que o DataContractSerializer conseguirá trabalhar, e com isso, do lado do cliente você pode utilizar Linq To Xml para manipular, ou simples continuar utilizando o próprio XmlDocument.
    http://www.israelaece.com
    segunda-feira, 23 de agosto de 2010 17:51
    Moderador

Todas as Respostas

  • Olá Pedro,

    Um workaround simples  poderia ser retornar o xml como string. Eu costumo fazer isso e funciona ok nos meus sistemas.

     

    Abraços,

    Mário


    Mário Meyrelles
    Diretor de Tecnologia
    www.accendis.com.br
    www.twitter.com/mariomeyrelles

    segunda-feira, 23 de agosto de 2010 14:12
  •  Olá mario, obrigado pela resposta. Eu sei disso, mas eu queria trabalhar direto com a classe se conversão de string.

    segunda-feira, 23 de agosto de 2010 14:31
  • Eh mais facil vc criar um objecto com a estrutura de dados do seu xml e passa o objeto como retorno então...

    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/1442977b-6b40-48e3-ac5c-e55d2e82fd0d


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    segunda-feira, 23 de agosto de 2010 15:43
    Moderador
  • Olá Pedro,

    Uma outra alternativa que não testei se pode funcionar é arriscar o uso do XElement do Linq to XML. Ele é serializável como XML... talvez seja útil.

     

    Se não der certo, vc será realmente obrigado a criar um tipo de dados que corresponda à representação do seu XML, conforme o Rui citou.

     


    Abraços,

    Mário


    Mário Meyrelles
    Diretor de Tecnologia
    www.accendis.com.br
    www.twitter.com/mariomeyrelles

    segunda-feira, 23 de agosto de 2010 16:47
  • Boas Pedro,

    O ASP.NET Web Service consegue fazer uma mágica para lidar com o XmlDocument e persistí-lo, mas isso não quer dizer que na outra ponta você também terá este mesmo objeto. Na verdade, ele será substituído pelo objeto XmlNode.

    O que você faz do outro lado é construir um XmlDocument e carregar o resultado do WebMethod para dentro dele. Se você consumir esse serviço em ASMX em WCF, verá que ele cria contratos de mensagens (http://www.israelaece.com/post/WCF-MessageContracts.aspx) ao invés de reconstruir um XmlDocument.

    No WCF não é diferente. Ele apenas deixa claro que esse objeto não pode serializar o XmlDocument. No caso do WCF, você deve retornar retornar o XmlElement, que o DataContractSerializer conseguirá trabalhar, e com isso, do lado do cliente você pode utilizar Linq To Xml para manipular, ou simples continuar utilizando o próprio XmlDocument.
    http://www.israelaece.com
    segunda-feira, 23 de agosto de 2010 17:51
    Moderador