5

我正在使用 Delphi XE2 DataSnap 库。我的数据快照服务器是基于 HTTP 的(TIdHTTPWebBrokerBridge 或 ISAPI)。

首次访问 DataSnap 服务时,TDSServer 实例将通过 TDSServerMethodProvider.Open 和 TDSServerMethodProvider.AddRegisterServerClasses 注册所有可用的服务器方法(参见单元 Datasnap.DSCommonServer.pas)。

datasnap 类名和服务器方法必须预先注册,否则客户端访问服务时会失败。

我正在考虑制作一个可以动态加载数据快照类和服务器方法的应用程序。我的 datasnap 应用程序不知道类或服务器方法是否可供访问,直到它开始基于 URL 查找服务。例如,像这样的 URL:

http:/.../datasnap/rest/TServerMethods1/ReverseString

将使应用程序在使用该方法之前寻找类 TServerMethods1 并注册。

我们可以使用 TWebModule.BeforeDispatch 事件来识别 Request.URL 字符串并确定为相应的 datasnap 类加载哪些包。

通过使用这种方法,我可以编写一个灵活且可扩展的通用 DataSnap 应用程序。

在检查了 DataSnap 源代码后,我发现除非对现有的 DataSnap 源进行一些额外的工作,否则这是不可能的。对注册至关重要的类 TDSServerMethodProvider 中很少有方法在私有部分中声明:AddRegisteredServerClasses, AddAllMethods

TDSServerMethodProvider 类似乎不是为额外注册而设计的。它只允许注册一次。

4

0 回答 0