2010-06-01 13 views
5

Soy completamente nuevo en los servicios web, pero no soy nuevo en Delphi.referencias "attributeGroup" ignoradas por Delphi WSDL Import Tool

Importación de un archivo WSDL en Delphi 2010 con el asistente "Importador WSDL". El archivo WSDL contiene algunas etiquetas "attributeGroup" que Delphi ignora por completo, lo que presumiblemente es un error, aunque todavía no he encontrado una entrada en Quality Central para este problema, solo menciona en foros como here y here.

Mi pregunta tiene varias partes:

  1. ¿Cuál es la mejor solución?
  2. He escrito una secuencia de comandos de Python para formatear el archivo WSDL de modo que todas las referencias a las etiquetas attributeGroup se reemplacen con la declaración de los atributos definidos en los attributeGroups; en otras palabras, aplanando las referencias. La salida se importa con éxito en Delphi a través del asistente de "importador de WSDL", y parece correcta, pero todavía no he probado si los mensajes construidos a través de este nuevo archivo WSDL funcionarán correctamente. ¿Es probable que esta estrategia sea viable, o debería dejarla ahora y pasar a otra cosa más productiva?

actualización

Basado en mis experiencias, y las respuestas en esta pregunta, decidí ir a la ruta envoltorio con una aplicación de consola de C# que se alimenta de datos de entrada JSON y da salida JSON datos de respuesta. Una aplicación Delphi maneja la aplicación C#. La parte SOAP de todo esto ahora es sencilla, y "simplemente funciona" en C# .NET, y Delphi maneja bien el resto de la funcionalidad. Recomendaría esta ruta a cualquier persona con problemas similares. Intenté exportar un ensamblado C# SOAP como una biblioteca COM y me conecté con Delphi, pero se volvió muy complejo, porque la especificación SOAP en mi aplicación particular es grande y algo compleja.

+0

Por lo tanto, se puede añadir que QC Informe ti mismo ... –

+0

Algunos ejemplos detallados ayudaría a entender sus issue.in mi código – mj2008

+0

@ mj2008: Delphi importador de WSDL ignora por completo "attributeGroup" referencias de etiquetas en archivos WSDL .. ¿Cómo podría ayudar un ejemplo ilustrar esto? –

Respuesta

2

Bien, este tomó un tiempo.

De acuerdo con this post, hay ciertas etiquetas que el wsdl de .NET.La herramienta exe simplemente no reconocerá al importar un archivo wsdl. De acuerdo con MSDN:

attributeGroup: Ignorado. DataContractSerializer no admite el uso de xs: group, xs: attributeGroup y xs: attribute. Estas declaraciones se ignoran como elementos secundarios de xs: schema, pero no se pueden hacer referencias desde complexType u otras construcciones admitidas.

Este comportamiento también se describe (aunque de una manera muy difícil de entender) en uno de los MSDN blogs. En mi caso concreto, la parte particular del archivo WSDL que causa el problema es el siguiente:

<xs:complexType name="PhonesType"> 
    <xs:annotation> 
     <xs:documentation xml:lang="en">Provides detailed phone information.</ xs:documentation> 
    </xs:annotation> 
    <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="Phone"> 
      <xs:annotation> 
       <xs:documentation xml:lang="en">Used to pass detailed phone information.</xs:documentation> 
      </xs:annotation> 
      <xs:complexType> 
       <xs:attributeGroup ref="TelephoneInfoGroup"/> 
       <xs:attributeGroup ref="ID_OptionalGroup"> 
        <xs:annotation> 
         <xs:documentation xml:lang="en">The ID attribute in this group is a unique identifying value assigned by the creating system and may be used to reference a primary-key value within a database or in a particular implementation.</xs:documentation> 
        </xs:annotation> 
       </xs:attributeGroup> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

Parece que el <xs:attributeGroup ref="TelephoneInfoGroup"/> está siendo ignorada por la herramienta .NET wsdl.exe, al igual que lo estaba siendo ignorada por el importador Delphi wsdl. En tal situación, donde la importación falla tanto en Delphi como en .NET, es probable que el archivo wsdl tenga que ser cambiado, y eso significa que tendré que usar mi flat-ref de python ref-flattener.

1

Tuvimos un problema similar con Delphi 2009 y un servicio de Soap estándar (CRM). No estaba relacionado con attributeGroup. Encontramos tantas incompatibilidades que finalmente decidimos usar una pequeña aplicación C# como proxy para el servicio real basado en .Net.

+0

Eso es exactamente de lo que tengo miedo. ¿Cómo conectaste la aplicación proxy C# a Delphi? –

+0

Era una interfaz unidireccional: utilizamos archivos XML simples para mover datos desde el sistema interno al CRM. También podríamos haber usado un servidor Soap simple en la aplicación C# que puede ser consumido por la aplicación Delphi o un servidor HTTP con JSON. Pero para las interfaces internas, el intercambio simple basado en archivos está bien – mjn

1

Fui el póster de la primera referencia que me das. Creo que descubrí que este error nunca se solucionó.

tarde he publicado another question en el Embarcadero Developer Network, donde Nick Hodges dijo que

nos estamos concentrando en el desarrollo de clientes [...] si usted está buscando para construir servidores de jabón, y luego me gustaría sugerir que también le das una mirada a Delphi Prism.

Decidimos cambiar a C# para el desarrollo de nuestros servidores SOAP. Decidí dejar que el servicio hablara con una base de datos, a la que luego accede nuestra aplicación Delphi.

Más tarde me encontré con problemas con el desarrollo de clientes en Delphi, así que también estamos haciendo eso en C#. Esta vez, la clase C# es com visible y se puede acceder desde Delphi. Parece que funciona bien.

Saludos, Miel.

+0

¡Muchas gracias por su respuesta! Parece que tengo que ir por la ruta C# aquí. Me gusta el uso que hace mjustin de la descarga de archivos para el intercambio de datos (porque es muy simple), así que probablemente vaya con eso, porque básicamente inicias sesión de forma gratuita. Gracias de nuevo. –

0

El importador Delphi WSDL no puede manejar los elementos <xsd:attributeGroup ref="...">, pero puede reemplazarlos con los atributos reales a los que se hace referencia, que el importador puede manejar.

A continuación se muestra una secuencia de comandos de PowerShell que hace esta sustitución.

El script no está pulido. Es justo lo que creé para mis propias necesidades. También puede funcionar para usted, o al menos debería darle un punto de partida.

$xsdPath = "E:\scratch\InputFile.wsdl" 

# Note: Must be full path. 
$outPath = "E:\scratch\OutputFile.wsdl" 

$xsd = [xml](gc $xsdPath) 

$ns = @{xsd="http://www.w3.org/2001/XMLSchema"} 

$attrGroupDefs = $xsd | 
    Select-Xml -Namespace $ns -XPath "//xsd:schema/xsd:attributeGroup" | 
    select -ExpandProperty Node 

$attrGroupRefs = $xsd | 
    Select-Xml -Namespace $ns -XPath "//xsd:complexType/xsd:attributeGroup" | 
    select -ExpandProperty Node 

$attrGroupRefs | % { 
    # the thing to be replaced 
    $ref = $_ 

    $refParent = $ref.ParentNode 

    $namespace, $name = $_.ref -split ":" 
    $attrs = $attrGroupDefs | ? name -eq $name | select -ExpandProperty attribute 

    # remove the reference 
    $refParent.RemoveChild($ref) 

    # add the actual definitions 
    $attrs | % { 
     $newNode = $_.CloneNode($true) 
     $refParent.AppendChild($newNode) 
    } 
} 

$xsd.Save($outPath)