2011-03-14 50 views
2

作爲導入Web服務以與其系統進行互操作的一部分,我從客戶端收到了一個WSDL。他們發送了兩個文件:一個WSDL和一個模式。當我運行WSDL導入程序時,得到的輸出如下所示:如何導入此WSDL?

type 

    // ************************************************************************ // 
    // The following types, referred to in the WSDL document are not being represented 
    // in this file. They are either aliases[@] of other types represented or were referred 
    // to but never[!] declared in the document. The types from the latter category 
    // typically map to predefined/known XML or Embarcadero types; however, they could also 
    // indicate incorrect WSDL documents that failed to declare or import a schema type. 
    // ************************************************************************ // 
    // !:LoadData  - "http://client.com/"[Lit][] 
    // !:LoadDataResponse - "http://client.com/"[Lit][] 


    // ************************************************************************ // 
    // Namespace : http://client.com/ 
    // transport : http://schemas.xmlsoap.org/soap/http 
    // style  : document 
    // binding : ClientPortBinding 
    // service : ClientService 
    // port  : ClientPort 
    // URL  : http://localhost:8080/ClientService 
    // ************************************************************************ // 
    IClientLoad = interface(IInvokable) 
    ['{8DC02C6F-78D3-E09A-FE43-EE5211DB188D}'] 

    // Cannot unwrap: 
    //  - Input part does not refer to an element 
    //  - Output part does not refer to an element 
    function LoadDataBatch(const parameters: LoadData): LoadDataResponse; stdcall; 
    end; 

缺少的類型在它們發送的模式文件中定義。我試圖改變WSDL的進口線看起來是這樣,但它並沒有改變什麼:

<xsd:import namespace="http://client.com/" schemaLocation="file://C:/Users/mwheeler/Documents/WSDL/ClientLoadData Schema.xml"></xsd:import>

如何設置這種不當使德爾福的WSDL導入嚮導會檢查我的本地系統上的模式文件並從中讀取類型定義?

+0

我還沒有嘗試過,但在WSDL導入程序中有一個選項。 '包含進程和導入模式'。聽起來像你需要的東西。默認打開,所以你可能已經有了。 – 2011-03-14 18:48:37

+0

在使用我們自己的服務和客戶時,我們在工作中遇到了這樣的麻煩。這與D2010導入拒絕非標準類型的元素有關,即使它們在名稱空間中被明確定義。我認爲他們通過在soap界面中使用標準數據類型來解決這個問題。如果您明天早上(UTC + 1)還沒有找到答案,我會與同事覈對。 – 2011-03-14 18:49:56

+0

@duffymo:請仔細閱讀問題。我沒有在問題中包含WSDL,只是(輸出的匿名版本)。這特別是一個Delphi WSDL Importer問題;不是WSDL/XML問題。 – 2011-03-14 18:52:18

回答

0

問題可能不在進口端,而是在出口端。我們遇到的情況:

  • 一個Delphi編碼的服務器應用程序,它也響應SOAP webrequests。
  • 一個.Net編碼的客戶端應用程序,它使用SOAP與Delphi服務器應用程序進行通信。

如果在任何導出的SOAP接口中沒有使用該(基本)類型,則Delphi服務器應用程序不會也不會在其WSDL響應中導出特定(基本)類型。

實施例:

TBaseReponseClass = class(TRemotable) 
end; 

TLoginResponseClass = class(TBaseReponseClass) 
end; 

ISOAPResponse = interface(IInvokable) 
['{SomeGUID}'] 
    function Ping: TBaseReponseClass ; stdcall 
    function Login: TLoginResponseClass ; stdcall; 
end; 

隨着在ISOAPResponse平功能,一切都正常工作。

如果在ISOAPResponse中沒有Ping函數,那麼TBaseResponseClass將不會在WSDL中導出,並且在.Net端導入WSDL會引發有關未定義元素的錯誤。

我想你可以檢查你從客戶端獲得的WSDL,看它是否使用任何類,祖先層次中的一個或多個類不包含在WSDL/Schema中。如果是這種情況,那麼你可能不得不回到你的客戶,讓他們修改接口。或者,如果你很幸運,也許會發現一些選項可以讓祖先類不包含在WSDL/Schema中。我們沒有對後者進行調查,因爲我們有兩個應用程序都在我們自己的控制之下,並且簡單地添加「Ping」功能更容易。