WSDL utilidad mono no puede procesar el archivo WSDL de eBay para su SOAP API
-
12-09-2019 - |
Pregunta
Estoy recibiendo este error de la utilidad de Mono WSDL al intentar procesar archivo WSDL de eBay -
( http://developer.ebay.com/webservices/latest/eBaySvc. WSDL)
$ wsdl eBaySvc.wsdl
Web Services Description Language Utility
Mono Framework v2.0.50727.1433
Error: XmlSchema error: Ambiguous element label which is contained by -any- particle was detected: urn:ebay:apis:eBLBaseComponents:PreferenceLevel Related schema item SourceUri: file:///home/manger/projects/ebay/eBaySvc.orig.wsdl, Line 10296, Position 7.
Stack:
at System.Xml.Schema.ValidationHandler.RaiseValidationEvent (System.Xml.Schema.ValidationEventHandler handle, System.Exception innerException, System.String message, System.Xml.Schema.XmlSchemaObject xsobj, System.Object sender, System.String sourceUri, XmlSeverityType severity) [0x00000]
at System.Xml.Schema.XmlSchemaObject.error (System.Xml.Schema.ValidationEventHandler handle, System.String message, System.Exception innerException, System.Xml.Schema.XmlSchemaObject xsobj, System.Object sender) [0x00000]
at System.Xml.Schema.XmlSchemaObject.error (System.Xml.Schema.ValidationEventHandler handle, System.String message) [0x00000]
Búsqueda de Google para las soluciones revela una sugerencia de cambiar los elementos que comienzan con <xs:any ...
a <xs:any namespace="##other" ...
- esto sin duda hace que la utilidad de WSDL Mono capaz de procesar el archivo, para hacer un archivo .cs fuera de él. Pero entonces consigo una excepción de ejecución de mi programa en C # cuando intento crear una instancia de la clase de servicio web helper (eBayAPIInterfaceService service = new eBayAPIInterfaceService();
):
Unhandled Exception: System.InvalidOperationException: There was an error reflecting type 'AddDisputeRequestType'. ---> System.InvalidOperationException: There was an error reflecting field 'DetailLevel'. ---> System.InvalidOperationException: There was an error reflecting type 'DetailLevelCodeType'. ---> System.InvalidOperationException: There was an error reflecting type 'System.Object'. ---> System.InvalidOperationException: There was an error reflecting type 'AbstractResponseType'. ---> System.InvalidOperationException: There was an error reflecting field 'Errors'. ---> System.InvalidOperationException: There was an error reflecting type 'ErrorType'. ---> System.InvalidOperationException: There was an error reflecting field 'ErrorParameters'. ---> System.InvalidOperationException: There was an error reflecting type 'ErrorParameterType'. ---> System.InvalidOperationException: There was an error reflecting field 'Any'. ---> System.InvalidOperationException: The element Any has been attributed with an XmlAnyElementAttribute and a namespace '', but no name. When a namespace is supplied, a name is also required. Supply a name or remove the namespace.
at System.Xml.Serialization.XmlReflectionImporter.ImportAnyElementInfo (System.String defaultNamespace, System.Xml.Serialization.XmlReflectionMember rmember, System.Xml.Serialization.XmlTypeMapMemberElement member, System.Xml.Serialization.XmlAttributes atts) [0x00000]
at System.Xml.Serialization.XmlReflectionImporter.CreateMapMember (System.Type declaringType, System.Xml.Serialization.XmlReflectionMember rmember, System.String defaultNamespace) [0x00000]
at System.Xml.Serialization.XmlReflectionImporter.ImportClassMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00000]
--- End of inner exception stack trace ---
Es la herramienta WSDL de Mono en falta aquí, o WSDL / esquema de eBay? - varios mensajes en el foro que he visto dicen que el WSDL no coincide con el esquema, por lo Mono está haciendo lo correcto, pero ¿cómo lo arreglo para que pueda crear una instancia de la clase de servicio web ayudante de C #
?Las versiones de mis herramientas:
$ WSDL Web Services Description Language Utilidad Mono marco v2.0.50727.1433
$ GMC --version Mono compilador de C # versión 2.4.2.3
El código generado para ErrorParameterType:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.1433")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ebay:apis:eBLBaseComponents")]
public partial class ErrorParameterType {
private System.Xml.XmlElement[] anyField165;
... more class members follow ...
/// <remarks/>
[System.Xml.Serialization.XmlAnyElement(Namespace="")]
public System.Xml.XmlElement[] Any {
get {
return this.anyField165;
}
set {
this.anyField165 = value;
}
}
}
El archivo WSDL eBayAPIInterfaceService.cs cual genera después de mi 'arreglar' es aquí
Solución
No sé si esto resuelve su problema, pero el xs:any
comodín '#'> en su pregunta no se encuentra:
<xs:any namespace="##other" ...
↑
El C # código generado contiene una gran cantidad de definiciones de esta manera:
[System.Xml.Serialization.XmlAnyElement(Namespace="")]
public System.Xml.XmlElement[] Any {
get {
return this.anyFieldXXX;
}
set {
this.anyFieldXXX = value;
}
}
MSDN :
Aplicar la
XmlAnyElementAttribute
a un campo que devuelve una matriz deXmlElement
oXmlNode
objetos. un campo de este tipo puede ser utilizado de dos maneras, dependiendo de si un objeto está siendo serializado o deserializar. Cuando serializado, el objeto se genera como elementos XML o nodos, a pesar de que no tienen ningún miembro correspondiente (o miembros) en el objeto que está siendo serializado. Si especifica un valor de propiedadName
cuando se aplica el atributo, todos los objetosXmlElement
oXmlNode
insertados en la matriz deben tener el mismo nombre del elemento y por defecto espacio de nombres, o se produce una excepción. Si se establece el valor de la propiedadNamespace
, debe establecer la propiedadName
así , y losXmlElement
oXmlNode
objetos también debe tener el mismo nombre de espacio de nombres y valores. Si no se especifica ningún valorName
, losXmlElement
oXmlNode
objetos pueden tener cualquier nombre del elemento.
Así que supongo que la solución es quitar simplemente los valores de las propiedades Namespace
:
[System.Xml.Serialization.XmlAnyElement]