如何导入此WSDL?

时间:2011-03-14 18:42:56

标签: delphi wsdl delphi-2010 soap-client

我从客户端收到了一个WSDL,作为导入Web服务以与其系统进行互操作的一部分。他们发送了两个文件: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>

如何正确设置,以便Delphi的WSDL导入向导检查本地系统上的模式文件并从中读取类型定义?

1 个答案:

答案 0 :(得分:0)

问题可能不在导入方面,而是在导出方面。我们的情况:

  • 一个Delphi编码的服务器应用程序,它也响应SOAP webrequests。
  • 使用SOAP与Delphi服务器应用程序通信的.Net编码客户端应用程序。

如果在任何导出的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中的Ping功能,一切正常。

如果没有ISOAPResponse中的Ping函数,TBaseResponseClass将不会在WSDL中导出,并且在.Net端导入WSDL会引发有关未定义元素的错误。

我想您可以检查从客户端获得的WSDL,看它是否使用了祖先层次结构中的一个或多个类未包含在WSDL / Schema中的任何类。如果是这种情况,那么您可能需要回到客户端来修改接口。或者,如果您很幸运,也许可以找到一些选项来让WSDL / Schema中没有直接引用的祖先类。我们没有调查后者,因为我们有两个应用程序都在我们自己的控制之下,并且更容易简单地添加“Ping”功能。