- 1、本文档共55页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最近阅读了 SocketConn 的源码和 WebService 的源码,把追踪的过程写了下来,方便大家学习。毕竟这需要精力,时间和毅力。感谢煮茶待英雄博志区和三层数据库讨论区兄弟们的支 持,特别是 julian 兄弟,不是他,我可能没耐心继续下去。如果有时间,大家可以继续完善。从 socket 和 Websevice 的底层实现细节,我们发现 BORLAND 的工程师们的构思和实现的过程。我觉得这对我们的学习应该是非常重要的。学会思考。学会读源码,学会分析。
希望和我交往的朋友可通过 QQ 或 Email 联系我。 Wu_yanan2003@
另见:《远程调用技术代码追踪(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 封包内容找到相应的接口及方法。
TRemotableClassRegistry = TRemotableTypeRegistry;
所对应的是 TremotableTypeRegistry, 这个类主要是对数据类型进行注册。
大致来了解一下这个类。
TInvokableClassRegistry = class(TInterfacedObject) private
FLock: TRTLCriticalSection; FRegClasses: array of InvRegClassEntry; FRegIntfs: array of InvRegIntfEntry;
这里可以看到,声明了两个动态数组。分别用来放接口注册,及类注册信息。
TCreateInstanceProc = procedure(out obj: TObject); InvRegClassEntry = record
ClassType: TClass;
Proc: TCreateInstanceProc; URI: string;
end;
它包含了 webservice 实现类的指针,以建立实现类的 factory 函数指针。
InvRegIntfEntry = record
Name: string; { Native name of interface }
ExtName: Widestring; { PortTypeName }
UnitName: string; { Filename of interface } GUID: TGUID; { GUID of interface } Info: PTypeInfo; { Typeinfo of interface }
DefImpl: TClass; { Metaclass of implementation }
Namespace: Widestring; { XML Namespace of type
您可能关注的文档
- 语文校本培训心得体会五篇合集.docx
- 语文学科主题教研研讨记录.docx
- 语文一年级下册量词练习.docx
- 语文优质课堂教学设计研究成果.docx
- 语文阅读答题格式完整版.docx
- 语文知识与能力训练人教版四年级上答案.docx
- 语文中考复习备考方案.docx
- 语文中考字音字形选择题精选50道1.docx
- 语文周记分析和总结.docx
- 语文作业设计.docx
- 4.2特异性免疫——2024-2025学年高二生物学人教版(2019)选择性必修一随堂测试(含答案).docx
- 第18课世界主要国家的基层治理与社会保障——高二历史人教统编版选择性必修1随堂测试(含答案).docx
- 第五单元 工业革命与马克思主义的诞生 测试卷(含答案).docx
- 河北省沧州市泊头市第一中学2024-2025学年高二上学期10月月考生物试题(无答案).docx
- 登高实用专题教育课件.pptx
- 古罗马文化资料汇总.pptx
- 2022~2023保育员考试题库及答案第164期.pdf
- 2023年度工作计划表模板(5篇).pdf
- 人教版五年级上册数学寒假专题训练:求阴影部分的面积.pdf
- 产品代理授权委托书范本(优秀范文五篇).pdf
文档评论(0)