我从客户端收到了一个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导入向导检查本地系统上的模式文件并从中读取类型定义?
答案 0 :(得分:0)
问题可能不在导入方面,而是在导出方面。我们的情况:
如果在任何导出的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”功能。