. NET SOAP служебный интерфейс без надлежащего WSDL - PullRequest
0 голосов
/ 16 июня 2020

Я изо всех сил пытаюсь расширить проект legacy. NET 2.0 (Delphi) для использования веб-службы, для которой издатель не предоставляет полноценный WSDL. Он только предоставил WSDl со всеми параметрами и типами ответов, объявленными как any:

    <s:complexType>
          <s:sequence>
            <s:any minOccurs="0" maxOccurs="1" />
          </s:sequence>
    </s:complexType>

с дополнительными файлами xsd, описывающими параметры и типы ответов. Хотя с параметром c не было проблем, мне не удалось создать класс для десериализации ответа XML. Это то, что я получаю

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <CrearOfertasResponse xmlns="http://somenamespace.com">
      <Ofertas xmlns="">
        <Oferta codigo="TBGE202006151805211">
          <Errores>
            <Error>Some error text</Error>
          </Errores>
        </Oferta>
      </Ofertas>
    </CrearOfertasResponse>
  </soapenv:Body>
</soapenv:Envelope>

, и это объявления методов / классов, которые я использую:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute(
      'http://somebinding',
      RequestNamespace='http://somenamespace.com',
      ResponseNamespace='http://somenamespace.com',
      Use=System.Web.Services.Description.SoapBindingUse.Literal,
      ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
      [result: System.Xml.Serialization.XmlElementAttribute('CrearOfertasResponse')]
      function CrearOfertas(Ofertas:requestParameterType):OfertasResponse;

      OfertaResponse = class {fragment}
      strict private
        itemsField: TArrayOfSystem_Object;
        itemsElementNameField: TArrayOfResponseItemsChoiceType;
        codigoField: string;
      public
        function get_Items: TArrayOfSystem_Object;
        function get_ItemsElementName: TArrayOfResponseItemsChoiceType;
        function get_codigo: string;
        procedure set_Items(Value: TArrayOfSystem_Object);
        procedure set_ItemsElementName(Value: TArrayOfResponseItemsChoiceType);
        procedure set_codigo(Value: string);
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute('Detalle', TypeOf(string))]
        [System.Xml.Serialization.XmlElementAttribute('Errores', TypeOf(Errores))]
        [System.Xml.Serialization.XmlElementAttribute('Estado', TypeOf(string))]
        [System.Xml.Serialization.XmlChoiceIdentifierAttribute('ItemsElementName')]
        property Items: TArrayOfSystem_Object read get_Items write set_Items;
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute('ItemsElementName')]
        [System.Xml.Serialization.XmlIgnoreAttribute]
        property ItemsElementName: TArrayOfResponseItemsChoiceType read get_ItemsElementName write set_ItemsElementName;
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute]
        property codigo: string read get_codigo write set_codigo;
      end;

      TArrayOfOfertaResponse = array of OfertaResponse;

      [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=True)]
      [System.Xml.Serialization.XmlTypeAttribute('Ofertas')]
      OfertasResponse = class {fragment}
      strict private
        ofertaField: TArrayOfOfertaResponse;
      public
        function get_Oferta: TArrayOfOfertaResponse;
        procedure set_Oferta(Value: TArrayOfOfertaResponse);
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute('Oferta')]
        property Oferta: TArrayOfOfertaResponse read get_Oferta write set_Oferta;
      end;

      Error = class {fragment} 
        strict private
          codigoField: string;
          valueField: string;
        public
          function get_codigo: string;
          function get_Value: string;
          procedure set_codigo(Value: string);
          procedure set_Value(Value: string);
          /// <remarks/>
          [System.Xml.Serialization.XmlAttributeAttribute]
          property codigo: string read get_codigo write set_codigo;
          /// <remarks/>
          [System.Xml.Serialization.XmlTextAttribute]
          property Value: string read get_Value write set_Value;
        end;

        TArrayOfError = array of Error;

        Errores = class {fragment}
          strict private
            errorField: TArrayOfError;
          public
            function get_Error: TArrayOfError;
            procedure set_Error(Value: TArrayOfError);
            /// <remarks/>
            [System.Xml.Serialization.XmlElementAttribute('Error')]
            property Error: TArrayOfError read get_Error write set_Error;
          end;

Вызов таких CrearOfertas

    function OfertasWS.CrearOfertas(Ofertas:RequestParameterType):OfertasResponse;
    var
      results: TArrayOfSystem_Object;
    begin
      results := Self.Invoke('CrearOfertas', [Ofertas]);
      result := OfertasResponse(results[0]);
    end;

Возвращает ли результат = [null]

Есть какие-нибудь подсказки относительно того, что не так с моими объявлениями метода / класса?

...