Mi equipo tiene la tarea de obtener varias aplicaciones cliente .NET desarrolladas internamente para conectarse a algunos servicios web Java nuevos. El servicio web Java es un archivo WSDL suministrado por un proveedor externo que nuestro equipo tiene una capacidad limitada de modificar/controlar ... lo que significa que probablemente tenemos el poder de solicitarle a nuestro proveedor que realice pequeños ajustes al WSDL, pero probablemente se producirán cambios importantes. ser inviable o difícil de solicitar.WCF Problemas de serialización con el archivo WSDL creado por las herramientas de Java
Dicho esto, estamos intentando utilizar WCF/.NET 4.0 para generar los archivos de clase de proxy .NET que necesitamos en el lado del cliente. El proceso de generación de archivos de clase de cliente proxy se ejecuta sin problemas.
El problema es cuando intentamos usar el archivo de la clase proxy en una aplicación cliente. He verificado a través de la herramienta de rastreo web, Fiddler, que la solicitud de mensaje SOAP sin procesar no se envía a través del cable al servidor.
El mensaje específico excepción de .NET consigo al intentar llamar al método de servicio web en cuestión, tiene el siguiente aspecto:
System.InvalidOperationException fue controlada Mensaje = XmlSerializer atributo es System.Xml.Serialization.XmlAttributeAttribute no válido en baseLanguage. Solo los atributos XmlElement, XmlArray, XmlArrayItem, XmlAnyAttribute y XmlAnyElement son compatibles cuando IsWrapped es verdadero. Fuente = System.ServiceModel
Cuando examino el archivo .NET autogenerado clase de proxy, Reference.cs, me di cuenta de que los mensajes de solicitud y respuesta para mi método de servicio web se ve algo como esto:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="QueryPBOT_MXWO_OS", WrapperNamespace="http://www.ibm.com/maximo", IsWrapped=true)]
public partial class QueryPBOT_MXWO_OSRequest {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=0)]
public ConsoleApplication7.wsMaximo.PBOT_MXWO_OSQueryType PBOT_MXWO_OSQuery;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=1)]
[System.Xml.Serialization.XmlAttributeAttribute()]
public string baseLanguage;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=2)]
[System.Xml.Serialization.XmlAttributeAttribute()]
public string transLanguage;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=3)]
[System.Xml.Serialization.XmlAttributeAttribute()]
public string messageID;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=4)]
[System.Xml.Serialization.XmlAttributeAttribute()]
public string maximoVersion;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=5)]
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute(false)]
public bool uniqueResult;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=6)]
[System.Xml.Serialization.XmlAttributeAttribute(DataType="positiveInteger")]
public string maxItems;
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=7)]
[System.Xml.Serialization.XmlAttributeAttribute(DataType="integer")]
[System.ComponentModel.DefaultValueAttribute("0")]
public string rsStart;
public QueryPBOT_MXWO_OSRequest() {
}
public QueryPBOT_MXWO_OSRequest(ConsoleApplication7.wsMaximo.PBOT_MXWO_OSQueryType PBOT_MXWO_OSQuery, string baseLanguage, string transLanguage, string messageID, string maximoVersion, bool uniqueResult, string maxItems, string rsStart) {
this.PBOT_MXWO_OSQuery = PBOT_MXWO_OSQuery;
this.baseLanguage = baseLanguage;
this.transLanguage = transLanguage;
this.messageID = messageID;
this.maximoVersion = maximoVersion;
this.uniqueResult = uniqueResult;
this.maxItems = maxItems;
this.rsStart = rsStart;
}
}
Sé que las personas que lean esta publicación querrán ver el archivo WSDL real que estamos tratando de consumir, pero es bastante grande, y me preocupa que el tamaño real de la misma haga que identificar el error sea bastante difícil.
Espero que el archivo proxy de cliente autogenerado y la excepción .NET ayudarán a alguien a reconocer este problema de Serialización WCF.
Hemos confirmado por nuestro proveedor de Java que el estilo de WSDL que generan es literal de doc. Después de hacer algunas investigaciones en Internet, parece que WCF, por defecto. traduce los archivos WSDL con doc-literal wrapped, y esto puede explicar, al menos en parte, por qué estamos viendo este problema de serialización WCF con el archivo WSDL.
he descubierto, a través de ensayo y error, que la siguiente decorador de atributo en el archivo de clase de proxy es el culpable detrás de la edición de serialización:
[System.Xml.Serialization.XmlAttributeAttribute()]
Si comento todas las instancias de este atributo en el archivo de la clase proxy y vuelvo a ejecutar mi aplicación cliente, el mensaje SOAP se envía correctamente a través del cable y recibo una respuesta válida del servicio web.
Esta solución es mejor que nada, pero preferiría una solución que no requiera ni a mí ni a nadie en mi equipo para ajustar constantemente estos archivos de clase de proxy autogenerados .NET.
Me gustaría saber si hay algo que pueda hacer, ya sea a través de las distintas herramientas WCF o modificando el archivo WSDL, que impide que [System.Xml.Serialization.XmlAttributeAttribute()] se aplique a mi solicitud y propiedades del objeto de respuesta?
O al menos una descripción de alto nivel de ¿POR QUÉ estamos viendo este comportamiento de serialización en .NET con el archivo WSDL de Java?
gracias de antemano, John
¿La Atribución XmlAttribute está siendo agregada por usted o generada por WCF? –
El XMLAttributeAttribute es generado por las herramientas WCF, y no entiendo por qué. Si hay algún tipo de cambio en la herramienta para evitar que se cree, o algo que podamos cambiar en el archivo WSDL de origen, podemos evitar ajustar el archivo de la clase proxy para que funcione. –
¿Tiene una solicitud de muestra de jabón de trabajo de su proveedor de Java? –