Pregunta

Implementación actual

Base de datos SQL Server 2005 con una tabla llamada mensajes con una columna llamada MessageXml de tipo xml.

Proyecto de biblioteca C # con una clase Linq to Sql que genera una clase llamada Mensaje con un campo llamado MensajeXml de tipo XElement.

Servicio web WCF que expone una clase MessagePayload con una propiedad llamada MessageXml de tipo XElement.

El servicio web no sirve mi clase de mensaje creado por Linq a SQL. Yo uso un objeto ligero como un medio.

Pregunta

¿Es XElement realmente el tipo que quiero usar en mi servicio WCF o hay un tipo mejor? El xml que está destinado a pasar al servicio debe ser un documento completo. Además, tengo algunos problemas para cargar documentos xml como XElement. Creo que debería exponer un tipo de documento xml completo en la clase de peso ligero para el servicio, pero estoy un poco confundido sobre las diferencias entre XDocument y XmlDocument.

Además de eso, no puedo exponer la clase de mensaje WCF con una propiedad de tipo XDocument porque contiene una propiedad de tipo XDeclaration que no se puede serializar.

Si uso XmlDocument, entonces tengo que hacer esta extraña conversión de tipos xml en mi traducción entre la clase Linq y la clase ligera.

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

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

XmlDocument parece ser el correcto y sé que tendré que hacer alguna traducción, pero quiero estar lo más cerca posible de lo apropiado.

¿Fue útil?

Solución

Puede usar XElement o 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;
}

No desea XDocument ni XmlDocument . Recuerde que lo que devuelva estará en el medio de un documento XML que contiene el sobre SOAP. No puede tener un documento dentro de un documento, por lo que lo que quiere es un elemento.

Otros consejos

John Saunders está en el dinero aquí. Para explicar un poco, si observa el WSDL que se genera cuando devuelve un XmlElement o un XElement , verá algo como esto:

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

Eso es todo. Básicamente significa que cualquier XML puede ir aquí. También significa que, contrariamente a la sugerencia de Chansik, no vincula el tipo de retorno a un tipo específico de .NET.

Entonces sí, no necesita usar una cadena.

Use el tipo que necesite para serializar la clase (String siempre ha funcionado bien para mí) y luego realice conversiones cuando sea necesario en el lado del servidor o del cliente para mantener la integridad del documento. Puedes construir un XDocument a partir de uno o más XElements también, así que iría con XElement.

En el peor de los casos, incluso puede anular el comportamiento de serialización de su clase (no demasiado terrible si es bueno con la reflexión).

XmlDocument es el antiguo documento que no es de Linq. Son el mismo concepto implementado en diferentes clases.

En general, XDocument y XElememnt son preferibles a XmlDocument y XmlElement en términos de rendimiento.

Sin embargo, sugeriría usar string para enviar un documento XML a través del servicio WCF por los siguientes motivos:

  1. Interoperabilidad
    • Los clientes no están vinculados a una versión específica de .NET Framework (el cliente puede elegir usar XDocument o XmlDocument . Incluso los clientes basados ??en Java pueden ser compatibles siempre que los servicios WCF están configurados de esa manera).
  2. Manejo de la declaración Xml correctamente si el documento XML original lo contiene.

Nota: Asegúrese de ajustar la configuración adecuadamente para admitir un documento xml grande. Por ejemplo, el tamaño de mensaje máximo predeterminado de basicHttpBinding es 64 KB.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top