Утилита Mono wsdl не может обработать файл WSDL eBay для своего SOAP API

Я получаю эту ошибку от утилиты 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 поступает правильно, но как мне это исправить, чтобы я мог создать экземпляр вспомогательного класса веб-службы из 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 генерирует после моего «исправления», находится здесь < / а>


person matja    schedule 20.09.2009    source источник
comment
Как выглядит сгенерированный код для ErrorParameterType.Any?   -  person dtb    schedule 20.09.2009
comment
@dtb: Я добавил определение ErrorParameterType в текст вопроса, мне не удалось найти ErrorParameterType.Any в источнике. Я добавил ссылку на полный файл .cs, который создается. По ссылке Makefile и мой test.cs находятся в одном каталоге.   -  person matja    schedule 20.09.2009
comment
Namespace="" кажется виноватым; Я нашел цитату на MSDN (см. Мой ответ).   -  person dtb    schedule 20.09.2009


Ответы (1)


Не знаю, решит ли это вашу проблему, но 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]
person dtb    schedule 20.09.2009
comment
хорошее обнаружение - это была опечатка, которую я допустил, я действительно попробовал ## other - что порадовало инструмент wsdl, но я все еще получал исключение времени выполнения при запуске моей простой программы C # для создания экземпляра вспомогательного класса веб-службы - person matja; 20.09.2009
comment
@dtb: спасибо за предложение об удалении значений свойств пространства имен, которое, похоже, исправляет исключение времени выполнения, которое я получал, но теперь я получаю новое исключение времени выполнения: Unhandled Exception: System.InvalidOperationException: Member RequesterCredentialsField not found in class eBayAPIInterfaceService. - Что странно, потому что RequesterCredentialsField - первый член в eBayAPIInterfaceService. Я не понимаю, почему не находит. - person matja; 20.09.2009
comment
Поле RequesterCredentialsField является частным. XmlSerialization работает только с общедоступными свойствами / полями, т.е. он должен использовать общедоступное свойство RequesterCredentials вместо частного поля. - person dtb; 20.09.2009
comment
Спасибо, удаление пространства имен из сгенерированных свойств XmlAnyElement и использование общедоступного RequesterCredentialsField сработало отлично. - person matja; 20.09.2009