2010-06-01 23 views
5

我對網絡服務是全新的,但對Delphi來說並不陌生。「attributeGroup」引用由Delphi WSDL導入工具忽略

我正在使用「WSDL Importer」嚮導將WSDL文件導入到Delphi 2010中。 WSDL文件包含一些Delphi完全忽略的「attributeGroup」標記,這可能是一個bug,雖然我還沒有在Quality Central上找到關於此問題的條目,但僅在herehere這樣的論壇中提到過。

我的問題有以下幾個部分:

  • 什麼是最好的解決辦法?
  • 我已經編寫了一個Python腳本來格式化WSDL文件,使得對attributeGroup標記的所有引用都替換爲attributeGroups中定義的屬性的聲明;換句話說,扁平參考。輸出通過「WSDL導入器」嚮導成功導入到Delphi中,並且看起來正確,但我還沒有測試通過這個新的WSDL文件構造的消息是否可以正常工作。這種策略是否可行?或者我現在應該退出並轉向其他更有成效的方法嗎?
  • 更新

    根據我的經驗,在這個問題的答案,我決定去與吃JSON輸入數據和輸出JSON回覆數據的C#控制檯應用程序的包裝路線。 Delphi應用程序驅動C#應用程序。整個SOAP的一部分現在是毫不費力的,並且在C#.NET中「正常工作」,其餘的功能由Delphi處理。我會推薦這條路線給其他類似問題的人。我曾嘗試將C#SOAP程序集導出爲COM庫,並將其連接到Delphi,但它變得非常複雜,因爲我特定應用程序中的SOAP規範很大且有點複雜。

    +0

    所以,你可以添加QC報告自己... – 2010-06-07 18:24:12

    +0

    一些具體的例子,將有助於瞭解您的issue.in我的代碼 – mj2008 2010-06-10 15:57:06

    +0

    @ mj2008:德爾福WSDL進口商完全忽略了WSDL文件「attributeGroup」標記引用.. 。一個例子將如何幫助說明這一點? – 2010-06-10 22:09:18

    回答

    2

    好吧,這個花了一段時間。

    根據this post,有一些標籤,即.NET wsdl。當導入wsdl文件時,exe工具不會識別。據MSDN

    attributeGroup:忽略。 DataContractSerializer不支持使用xs:group,xs:attributeGroup和xs:attribute。這些聲明作爲xs:schema的子元素被忽略,但不能從complexType或其他受支持的構造中引用。

    此行爲在MSDN blogs之一中也被描述(儘管以非常難以理解的方式)。在我的具體情況,導致問題的WSDL文件的特定部分看起來是這樣的:

    <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> 
    

    看來,<xs:attributeGroup ref="TelephoneInfoGroup"/>正在由.NET Wsdl.exe用工具忽略,就像它正在被忽略德爾福wsdl進口商。在這種情況下,在Delphi和.NET導入失敗的情況下,wsdl文件可能需要更改,這意味着我將不得不使用我自制的python ref-flattener。

    1

    我們在Delphi 2009和一個標準的Soap服務(CRM)中遇到了類似的問題。它與attributeGroup無關。我們發現如此之多的不兼容性,以至於我們最終決定使用一個小型的C#應用​​程序作爲真正基於.Net的服務的代理。

    +0

    這正是我所害怕的。你是如何將C#代理應用程序連接到Delphi的? – 2010-06-05 22:05:02

    +0

    這是一個單向接口 - 我們使用簡單的XML文件將數據從內部系統移至CRM。我們也可以在C#應用程序中使用一個簡單的Soap服務器,它可以被Delphi應用程序或帶有JSON的HTTP服務器使用。但對於內部接口,簡單的基於文件的交換很好 – mjn 2010-06-06 17:49:41

    1

    我是你給的第一個參考的海報。我想我發現這個bug從未被修復過。

    我後來貼another question Embarcadero的開發者網絡,其中尼克·霍奇斯說,

    我們專注於客戶端的開發上[...]如果你正在尋找建立SOAP服務器,那麼我建議你也可以看看Delphi Prism。

    我們決定切換到C#來開發我們的SOAP服務器。我決定讓服務與數據庫交談,然後由我們的Delphi應用程序訪問。

    後來我在Delphi下遇到了客戶端開發的問題,所以我們在C#中也這樣做了。這次C#類是COM可見的,可以從Delphi中訪問。似乎工作正常。

    問候,米爾。

    +0

    非常感謝您的回覆!看來我可能不得不在這裏去C#路線。我喜歡mjustin使用文件轉儲進行數據交換(因爲它非常簡單),所以我可能會這樣做,因爲您基本上可以免費進行日誌記錄。再次感謝。 – 2010-06-21 22:01:21

    0

    Delphi WSDL導入程序無法處理<xsd:attributeGroup ref="...">元素,但可以用引用的實際屬性替換那些導入程序可以處理的屬性。

    下面是執行此替換操作的PowerShell腳本。

    該腳本是未磨光的。這正是我爲自己的需要而創造的。它也可能適用於你,或者至少它應該給你一個起點。

    $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)