2010-05-18 15 views
8

He creado un servicio WCF con un método que devuelve un System.Xml.XmlElement:VS2010 confunde System.Xml.XmlElement con System.Xml.Linq.XElement?

Interfaz:

[ServiceContract] 
public interface IWCFService 
{ 
    [OperationContract] 
    XmlElement Execute(...); 
} 

Servicio:

public XmlElement Execute(...) 
{ 
    XmlNode node = ...; 

    return (XmlElement)node; 
} 

Cuando intento acceder al servicio desplegado en mi servidor

WCFServiceClient service = new WCFServiceClient("WSHttpBinding_IWCFService"); 
XmlElement node = service.Execute(...); 

me sale el error:

Cannot implicitly convert type 'System.Xml.Linq.XElement' to 'System.Xml.XmlElement'

Buscando mi solución servicio, no puedo ver ninguna referencia a System.Xml.Linq.XElement. ¿Es malo de mi parte esperar un System.Xml.XmlElement o VS 2010 está bromeando conmigo?

+0

Intente llamar al servicio utilizando wcftestclient.exe. tuviste algun error? –

+0

@Raj: Esto no es posible ya que 'wcftestclient' no es compatible con' System.Xml.XmlElement'. Pero lo suficientemente gracioso no menciona nada sobre 'System.Xml.Linq.XmlElement'. – Chau

+0

Vea si esta publicación ayuda: http://social.msdn.microsoft.com/Foros/es-ES/wcf/thread/2f29bdab-a3ab-41b9-980a-692e7bb7e133 –

Respuesta

-1

odio a responder a mi propia pregunta, pero aquí va:

Por lo que yo puedo ver, el System.Xml.XmlElement se puede utilizar como un tipo de cambio de un servicio WCF. El DataContractSerializer utilizado por defecto en WCF hace support este tipo y por lo tanto no debería ser necesario usar el XmlSerializer.

Sin embargo, mi problema no tiene nada que ver con la serialización, pero gracias a Raj Kaimal por sugerir esta posibilidad.

Seguí el WCF tutorials dado por Microsoft, que le dice que agregue el servicio WCF como un Service Reference cuando desee utilizar el servicio. Esto parece estar bien en VS2008, pero al cambiar a VS2010 este enfoque changes the return type de System.Xml.XmlElement al (más reciente?) System.Xml.Linq.XElement. Para solucionar esto, debe agregar el servicio como Referencia web en su lugar.

+0

Esta no es una respuesta precisa. Su referencia de servicio se generó al descargar el esquema XML que está en el WSDL. Aparentemente, su esquema tiene algunos lugares donde acepta XML arbitrario. Cuando un cliente consume dicho servicio, es probable que el cliente elija algo como XmlElement o XElement como tipo de devolución. –

+0

@John: La respuesta es tan precisa como puedo hacerlo, al menos en este momento. Todavía estoy en el primer estado de uso de WCF (y XML), y mi respuesta parece funcionar para mí. No está ni cerca de una respuesta a prueba de bullit, lo sé, y cualquier edición es más que bienvenida. Gracias por su atención y comentario :) – Chau

+0

aquí hay un experimento: crear una clase de contrato de datos. Agregue un método a eso. Devuélvelo de una operación de servicio. Consúmelo en el cliente. Vea si el método existe en el cliente. A menos que use la función "compartir tipos", el método no estará allí, solo lo que puede pasar el WSDL. –

4

1) Eliminar la referencia System.Xml.Linq de su cliente 2) Actualización de su servicio de referencia 3) El archivo Reference.cs re-generado ahora consultará XmlElement en lugar de XElement

20

lo que he encontrado funciona mejor y más fácil para mí es hacer clic derecho en la referencia del servicio y luego hacer clic en "Configurar referencia de servicio". Una vez en el cuadro de diálogo para esto en la parte inferior, verá 2 botones de opción que dicen "Reutilizar tipos en todos ensamblados a los que se hace referencia" o "Reutilizar tipos en especificado ensamblados a los que se hace referencia". Haga clic en la segunda opción para 'conjuntos especificados'. El cuadro de lista se habilitará y podrá verificar todos los ensamblados y dejar System.Xml.Linqsin marcar. De esta forma, cada vez que actualice la referencia de servicio obtendrá los resultados esperados y esto se almacenará en la configuración del cliente.

Cuestiones relacionadas