我正在尝试使用Delphi XE6中的NAV 2009 Web服务(在XE5中是相同的),我使用"导入WSDL"从XE6和创建的单元公开了几个SOAP方法作为过程而不是函数。
以下是生成的代码:
Ficha_Cliente_Port = interface(IInvokable)
['{928A4E8E-B9A4-4C91-9666-D4DFE550D3CD}']
function Read_(const No: string): Ficha_Cliente; stdcall;
function ReadByRecId(const recId: string): Ficha_Cliente; stdcall;
function ReadMultiple(const filter: Array_Of_Ficha_Cliente_Filter; const bookmarkKey: string; const setSize: Integer): Ficha_Cliente_List; stdcall;
function IsUpdated(const Key: string): Boolean; stdcall;
function GetRecIdFromKey(const Key: string): string; stdcall;
procedure Create(const Ficha_Cliente: Ficha_Cliente); stdcall;
procedure CreateMultiple(const Ficha_Cliente_List: Ficha_Cliente_List); stdcall;
procedure Update(const Ficha_Cliente: Ficha_Cliente); stdcall;
procedure UpdateMultiple(const Ficha_Cliente_List: Ficha_Cliente_List); stdcall;
function Delete(const Key: string): Boolean; stdcall;
end;
例如,方法Create必须返回Ficha_Cliente类型的对象,并且在这种情况下没有返回值,因为这种实现是作为过程而不是函数。
我可以使用所有功能,但不能使用任何程序。
我从php和c#中使用这个web服务没有问题,但是我不知道用delphi做这个的方法,我是Delphi的新手。
* ---------------------------------------------- ---- WSDL中的方法定义是:
<operation name="Read"><input name="Read" message="tns:Read"/><output name="Read_Result" message="tns:Read_Result"/>
<operation name="Create"><input name="Create" message="tns:Create"/><output name="Create_Result" message="tns:Create_Result"/></operation>
消息Read,Read_Result,Create和Create_Result都是Ficha_Cliente类型,可以在下面看到
<message name="Create_Result"><part name="parameters" element="tns:Create_Result"/></message>
<xsd:element name="Create_Result">-<xsd:complexType>-<xsd:sequence><xsd:element name="Ficha_Cliente" type="tns:Ficha_Cliente" maxOccurs="1" minOccurs="1"/></xsd:sequence></xsd:complexType></xsd:element>
也就是说,在我看来,Delphi使用WSDL导入器生成的单元必须包含一个名为Create whith的函数,该函数类型为Create_Result(类型为Ficha_Cliente),但缺少。
如果我尝试在Delphi中执行命令(HTTPRIO1 as Ficha_Cliente_Port).Create(Ficha); 其中Ficha是Ficha_Cliente类型,项目已编译但我收到访问冲突错误。