Pergunta

Implementação atual

SQL Server 2005 banco de dados com uma tabela chamada mensagens com uma coluna chamada MessageXml do tipo XML.

C # Biblioteca projeto com uma classe LINQ to SQL que gera uma classe chamada da mensagem com um campo chamado MessageXml do tipo XElement.

WCF Webservice que expõe uma classe MessagePayload com uma propriedade chamada MessageXml do tipo XElement.

O webservice não serve a minha classe Message criado por Linq para Sql. Eu uso um objeto leve como um vão entre.

Pergunta

é XElement realmente o tipo que eu quero ser usando no meu serviço WCF ou há um tipo melhor. O xml que se destina a ser passado para o serviço deve ser um documento completo. Além disso, estou tendo um pouco de documentos de carga xml problemas como um XElement. Eu acho que eu deveria expor um tipo de documento XML completa na categoria peso leve para o serviço, mas estou um pouco confuso sobre as diferenças entre XDocument e XmlDocument.

Além disso, não posso expor a classe WCF mensagem com uma propriedade do tipo XDocument porque contém uma propriedade do tipo XDeclaration que não pode ser serializado.

Se eu usar XmlDocument que eu tenho que fazer esta conversão estranho de tipos XML em minha tradução entre a classe Linq ea classe leve.

 XmlDocument doc = new XmlDocument();
 doc.LoadXml(message.MessageXml.ToString());

 MessageEnvelope retVal = new MessageEnvelope()
 {
      MessageXml = doc,
 };

XmlDocument parece ser o caminho certo e eu sei que vou ter que fazer alguma tradução, mas quero chegar o mais perto de se apropriar possível.

Foi útil?

Solução

Você pode usar XElement ou XmlElement:

public XmlElement GetXmlElement()
{
    var doc = new XmlDocument();
    doc.Load(PREFIX + @"Enumerations.wsdl");

    return doc.DocumentElement;
}

public XElement GetXElement()
{
    var doc = XDocument.Load(PREFIX + @"Enumerations.wsdl");
    return doc.Root;
}

Você não quer qualquer XDocument nem XmlDocument. Lembre-se que tudo o que você voltar vai estar no meio de um documento XML que contém o envelope SOAP. Você não pode ter um documento dentro de um documento, então o que você quer é um elemento.

Outras dicas

John Saunders é sobre o dinheiro aqui. Para elaborar um pouco, se você olhar para o WSDL que é gerado quando você retornar tanto um XmlElement ou um XElement, você verá algo como isto:

<xs:complexType>
  <xs:sequence>
    <xs:any minOccurs="0" processContents="lax"/>
  </xs:sequence>
</xs:complexType>

É isso. Basicamente, significa qualquer XML pode ir aqui. Isso também significa que, ao contrário do sugestão de Chansik, que não vincula o tipo de retorno para um tipo .NET específico.

Então, sim, você não precisa usar uma string.

Use Independentemente do tipo que você precisa para serializar a classe (String sempre funcionou bem para mim) e, em seguida, fazer conversões quando necessário no lado do servidor ou do cliente para manter a integridade do documento. Você pode construir um XDocument para fora de um ou mais XElements também, então eu iria com XElement.

Na pior das hipóteses, você pode até substituir o comportamento de serialização de sua classe (não muito terrível se você é bom com reflexão).

XmlDocument é o velho documento, não Linq. Eles são o mesmo conceito implementado em diferentes classes.

Em geral, XDocument e XElememnt são preferíveis a XmlDocument e XmlElement em termos de desempenho.

No entanto, gostaria de sugerir a utilização string para enviar um documento XML através do serviço WCF, pelos seguintes motivos:

  1. Interoperabilidade
    • Os clientes não estão vinculados a .NET específica versão do framework (Cliente pode optar por usar XDocument ou XmlDocument. Clientes Mesmo baseados em Java podem ser apoiados, desde que os serviços WCF são configurados de tal maneira).
  2. Manipulação declaração XML corretamente se o documento XML original contém.

Nota: Por favor, certifique-se de ajustar a configuração adequada para suportar um grande documento XML. Por exemplo, o tamanho da mensagem máximo padrão de basicHttpBinding é 64KB.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top