最近阅读了 SocketConn 的源码和 WebService 的源码,把追踪的过程写了下来,方便大家学
习。毕竟这需要精力,时间和毅力。感谢煮茶待英雄博志区和三层数据库讨论区兄弟们的
支持,特别是 julian 兄弟,不是他,我可能没耐心继续下去。如果有时间,大家可以继续
完善。从 socket 和 Websevice 的底层实现细节,我们发现 BORLAND 的工程师们的构思和
实现的过程。我觉得这对我们的学习应该是非常重要的。学会思考。学会读源码,学会分
析。
希望和我交往的朋友可通过 QQ 或 Email 联系我。Wu_yanan2003@yahoo.com.cn
另见:《远程调用技术代码追踪(socket) 》
关注我的:《远程调用技术代码追踪(第三方控件) 》
远程调用技术内幕
有关 WebService 的相关的知识,我就不说了,我直接分析源码。有问题的地方请参
考李维的书。
initialization
InvRegistry.RegisterInterface(TypeInfo(IMyFirstWS), 'urn:MyFirstWSIntf-IMyFirstWS',
'utf-8');
看过李维的分布式架构的应该都知道,WEB 服务端对类和接口进行了注册,客户端这
里也进行了注册。然后客户端把数据通过 HTTP 传输到服务器端,服务器端通过拆包,去
到注册管理的类中寻找相应的接口,并创建一个相应的对象,把客户端的数据压进去,调
用后,把数据再传回来。
在调用这句的时候,TinvokableClassRegistry 类已经创建了,由于 inquire_v1 也引用了
InvRegistry 注册,所以在哪里被引用的时候已经被创建了。
function InvRegistry: TInvokableClassRegistry;
begin
if not Assigned(InvRegistryV) then
InitIR;
Result := InvRegistryV;
end;
初次引用会调用 InitIR 方法。
procedure InitIR;
begin
InvRegistryV := TInvokableClassRegistry.Create;
RemTypeRegistryV := TRemotableClassRegistry.Create;
RemClassRegistryV:= RemTypeRegistry;
InitBuiltIns; //定们到这一句:
InitXSTypes;
InitMoreBuiltIns;
end;
先看 InvRegistryV := TInvokableClassRegistry.Create;,这个类是用来注册,相应的接口及类,
并能够根据 soap 封包内容找到相应的接口及方法。