Ось WSDL со сложными типами не подходит для проверки - PullRequest
0 голосов
/ 22 апреля 2011

Я испытываю некоторый ад пространства имен схемы wsdl.

У меня есть WSDL, полученный из веб-службы Axis, и я пытаюсь создать заглушку с WCF для целей тестирования.

Проблема в том, что инструмент SVCUTIL генерирует код нормально, но при размещении никакие методы не предоставляются.

Я проверил WSDL, и есть строка, которая не проходит проверку. Я пытаюсь проверить, является ли это виновником, но пространства имен настолько беспорядочные, что я не могу разобраться с этим.

Итак, WSDL примерно такой. Я опустил привязки, службы и порты WSDL, так как хочу сосредоточиться на понимании проблемы пространств имен.

    <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"  xmlns:axis2="http://p1-services.customer.com/" 
                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"  xmlns:ns0="http://returnobject.foo.bar.com/xsd" 
                  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
                  xmlns:ns1="http://ws.receiver.foo.bar.com"  xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" 
                  xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
                  targetNamespace="http://p1-services.customer.com/">
    <wsdl:documentation>WSP1IA01Service</wsdl:documentation>
    <wsdl:types>
        <xs:schema xmlns:ax22="http://returnobject.foo.bar.com/xsd" 
                   attributeFormDefault="qualified"
                   elementFormDefault="qualified" targetNamespace="http://returnobject.foo.bar.com/xsd">
            <xs:complexType name="ReturnEnvelope">
                <xs:sequence>
                    <!-- Simplified -->
                    <xs:element minOccurs="0" name="errorCode" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
        <xs:schema xmlns:ns="http://ws.receiver.foo.bar.com" attributeFormDefault="qualified" elementFormDefault="qualified" 
                   targetNamespace="http://ws.receiver.foo.bar.com">
            <xs:element name="setMessage">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="xmlMessage" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="setMessageResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true"  type="ns0:ReturnEnvelope"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>
</wsdl:definitions>

Бит, который не проходит проверку, является ссылкой на ns0: ReturnEnvelope в элементе SetMessageResponse. Он говорит, что тип не может быть найден.

Я не могу понять почему, так как тип объявлен выше с targetNamespace, указывающим на префикс NS0.

Есть идеи? Должны ли эти объявления типов быть такими сложными?

Кроме того, какова цель этой конструкции:

<xs:schema xmlns:ax22="http://returnobject.foo.bar.com/xsd"

Я читал, что объявляет префикс "ax22" для дальнейшего использования в дочерних элементах. Но он не используется и сталкивается с пространством имен NS0.

Спасибо за любую помощь

1 Ответ

1 голос
/ 23 апреля 2011

Я не знаком с вашим набором инструментов, но вижу одну проблему, которая может быть причиной проблемы. Сначала немного базовой линии:

В wsdl:types определены две схемы. Первый предназначен для пространства имен http://returnobject.foo.bar.com/xsd, которое содержит тип ReturnEnvelope.

Вторая схема предназначена для пространства имен http://ws.receiver.foo.bar.com и определяет элемент setMessageResponse с типом ReturnEnvelope из пространства имен http://returnobject.foo.bar.com/xsd.

ax22 не используется и не нужен, но его присутствие не мешает ns0, представляющему то же пространство имен.

Второе определение схемы может "видеть" ns0, поскольку второе определение схемы вложено в wsdl:definitions, где определен префикс. Однако вторая схема не может использовать содержимое схемы для этого пространства имен (первая схема); они не связаны между собой братьями и сестрами. Чтобы разрешить использование типов других пространств имен, вам нужно добавить элемент xs:import во вторую схему:

<xs:import namespace="http://returnobject.foo.bar.com/xsd"/>

В зависимости от инструментов вам также может потребоваться указать, где эта схема находится, используя schemaLocation, но, надеюсь, она сможет это выяснить, поскольку они находятся рядом друг с другом.

...