Утилита Mono wsdl не может обработать файл WSDL eBay для их SOAP API - PullRequest
1 голос
/ 20 сентября 2009

Я получаю эту ошибку от утилиты Mono wsdl при попытке обработать файл WSDL на 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]

Поиск решений в Google показывает предложение изменить элементы, которые начинаются с <xs:any ... до <xs:any namespace="##other" ... - это, безусловно, делает утилиту Mono wsdl способной обрабатывать файл, чтобы сделать из него файл .cs. Но затем я получаю исключение времени выполнения из моей программы на C #, когда я пытаюсь создать экземпляр вспомогательного класса веб-службы (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 ---

Здесь виноват инструмент Mono wsdl или WSDL / схема eBay? - Несколько сообщений на форуме, которые я видел, говорят, что WSDL не соответствует схеме, поэтому Mono делает правильные вещи, но как мне это исправить, чтобы я мог создать экземпляр класса помощника webservice из C #?

Версии моих инструментов:

$ wsdl Утилита языка описания веб-сервисов Mono Framework v2.0.50727.1433

$ gmcs --version Mono C # компилятор версии 2.4.2.3

Сгенерированный код для 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;
        }
    }
}

Файл eBayAPIInterfaceService.cs, который генерирует wsdl после моего исправления, равен здесь

1 Ответ

1 голос
/ 20 сентября 2009

Я не знаю, решает ли это вашу проблему, но в вашем вопросе xs:any подстановочный знак пропускает два '#':

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

Сгенерированный код C # содержит множество определений, подобных этому:

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

С MSDN :

Примените XmlAnyElementAttribute к полю, которое возвращает массив объектов XmlElement или XmlNode. Такое поле можно использовать двумя способами, в зависимости от того, сериализуется или десериализуется ли объект. При сериализации объект генерируется как элементы или узлы XML, даже если они не имеют соответствующего члена (или членов) в сериализуемом объекте. Если при применении атрибута указать значение свойства Name, все объекты XmlElement или XmlNode, вставленные в массив, должны иметь одинаковое имя элемента и пространство имен по умолчанию, либо будет выдано исключение. Если вы задаете значение свойства Namespace, вы должны установить также свойство Name , и объекты XmlElement или XmlNode также должны иметь одинаковые значения имени и пространства имен. Если значение Name не указано, объекты XmlElement или XmlNode могут иметь любое имя элемента.

Итак, я думаю, что решение состоит в том, чтобы просто удалить значения свойства Namespace:

[System.Xml.Serialization.XmlAnyElement]
...