2009-09-20 6 views
1

Je reçois cette erreur de l'utilitaire wsdl Mono tout en essayant de traiter le fichier WSDL d'eBay -utilitaire Mono wsdl ne parvient pas à traiter le fichier WSDL d'eBay pour leur API SOAP

(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] 

Recherche Google Pour les solutions, il est suggéré de changer les éléments qui commencent par <xs:any ... à <xs:any namespace="##other" ... - cela rend certainement l'utilitaire wsdl de Mono capable de traiter le fichier, pour en faire un fichier .cs. Mais je reçois une exception d'exécution de mon programme C# lorsque je tente de instancier la classe d'aide webservice (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 --- 

est l'outil wsdl de Mono en faute ou WSDL/schéma d'eBay? - plusieurs messages de forum que j'ai vus disent que le WSDL ne correspond pas au schéma, donc Mono fait la bonne chose, mais comment est-ce que je le corrige pour que je puisse instancier la classe d'aide webservice de C#?

Versions de mes outils:

$ wsdl Web Services Description Language Utility Framework Mono v2.0.50727.1433

$ gmcs --version Mono C# version du compilateur 2.4.2.3

Code généré pour 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; 
     } 
    } 
} 

L'eB ayAPIInterfaceService.cs fichier qui génère wsdl après mon 'fix' est here

+0

Comment le code généré pour 'ErrorParameterType.Any' ressemble? – dtb

+0

@dtb: J'ai ajouté la définition de ErrorParameterType au texte de la question, je n'ai pas pu trouver 'ErrorParameterType.Any' dans la source. J'ai ajouté un lien vers le fichier .cs en cours de génération. Le lien a le Makefile et mon test.cs dans le même répertoire. – matja

+0

'Namespace =" "' semble être le coupable; J'ai trouvé une citation sur MSDN (voir ma réponse). – dtb

Répondre

1

Je ne sais pas si cela résout votre problème, mais le xs:any wildcard dans votre question est manquant deux '#':

<xs:any namespace="##other" ... 
        ↑ 

le code C# généré contient beaucoup de définitions comme celle-ci:

[System.Xml.Serialization.XmlAnyElement(Namespace="")] 
public System.Xml.XmlElement[] Any { 
    get { 
     return this.anyFieldXXX; 
    } 
    set { 
     this.anyFieldXXX = value; 
    } 
} 

de MSDN:

Appliquer le XmlAnyElementAttribute à un champ qui renvoie un tableau de XmlElement ou XmlNode objets. Un tel champ peut être utilisé de deux manières, selon qu'un objet est sérialisé ou désérialisé. Lors de la sérialisation, l'objet est généré en tant qu'éléments ou noeuds XML, même s'ils n'ont aucun membre correspondant (ou membres) dans l'objet en cours de sérialisation. Si vous spécifiez une valeur de propriété Name lors de l'application de l'attribut, tous les objets XmlElement ou XmlNode insérés dans le tableau doivent avoir le même nom d'élément et l'espace de nom par défaut, ou une exception est levée. Si vous définissez la valeur de propriété Namespace, vous devez définir la propriété Name ainsi que et les objets XmlElement ou XmlNode doivent également avoir les mêmes valeurs de nom et d'espace de noms. Si aucune valeur Name n'est spécifiée, les objets XmlElement ou XmlNode peuvent avoir n'importe quel nom d'élément.

donc je suppose que la solution est de supprimer simplement les valeurs de propriété Namespace:

[System.Xml.Serialization.XmlAnyElement] 
+0

bon spotting - c'était une faute de frappe que j'ai faite, j'ai essayé "## other" - qui a rendu l'outil wsdl heureux, mais j'ai toujours l'exception runtime lors de l'exécution de mon programme C# – matja

+0

@ dtb: merci pour la suggestion de supprimer les valeurs de propriété Namespace, cela semble certainement corriger l'exception d'exécution que j'obtenais, mais maintenant je reçois une nouvelle exception d'exécution: "Exception non gérée: System.InvalidOperationException: Member RequesterCredentialsField introuvable dans la classe eBayAPIInterfaceService. " - Ce qui est bizarre, car RequesterCredentialsField est le premier membre de eBayAPIInterfaceService. Je ne comprends pas pourquoi il ne le trouve pas. – matja

+0

Le champ 'RequesterCredentialsField' est privé. XmlSerialization fonctionne uniquement avec les propriétés/champs publics, c'est-à-dire qu'il doit utiliser la propriété publique 'RequesterCredentials' à la place du champ privé. – dtb