我已经使用 WSDL 导入器在 Delphi XE 中创建了 Web 服务。 Delphi 为我生成模块 ITransmitter1.pas ITransmitter接口(interface)和GetITransmitter函数。
要使用我使用的网络服务:
var Transmitter: ITransmitter;
begin
Transmitter := GetITransmitter(True, '', nil);
Transmitter.Transmit(Memo1.Text, OutXML);
end;
但我在任何地方都看不到 Transmit 方法的主体...
在 ITransmitter.pas 中我看到:
InvRegistry.RegisterInterface(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter#Transmit');
如果我评论这一行,我会收到“接口(interface)不支持”错误。 正如我在这里看到的,delphi 正在运行时添加方法! 它是如何工作的 ?我可以在运行时将方法添加到我自己的类中吗?
最佳答案
如果您使用 WSDL 导入器创建了 Web 服务客户端,则生成的客户端代码将调用服务器上的方法。所以实际上,方法“body”(代码)位于Web服务服务器上。
Delphi 基于 WSDL 生成 Soap 请求,并在后台使用 RTTI(内省(introspection))以 XML 形式生成 Web 服务调用的参数等。该 XML 被发送到服务器,服务器执行方法实现并发回 Soap 响应。
如果您创建 Web 服务服务器,情况则相反,在这种情况下,Delphi 应用程序当然需要实现所有方法体。
关于web-services - Delphi Web 服务如何工作? (在运行时添加方法??),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5549253/