我正在使用Delphi XE2 DataSnap库。我的datasnap服务器是基于HTTP的(TIdHTTPWebBrokerBridge或ISAPI)。
首次访问DataSnap服务时,TDSServer实例将通过TDSServerMethodProvider.Open和TDSServerMethodProvider.AddRegisterServerClasses注册所有可用的服务器方法(请参阅单位Datasnap.DSCommonServer.pas)。
datasnap类名和服务器方法必须预先注册,否则当客户端访问服务时它将失败。
我正在考虑创建一个可以动态加载datasnap类和服务器方法的应用程序。我的datasnap应用程序在开始根据URL查找服务之前不知道类或服务器方法是否可用于访问。例如,一个URL,如:
http:/.../datasnap/rest/TServerMethods1/ReverseString
将使应用程序在使用方法之前查找类TServerMethods1并注册。
我们可以使用TWebModule.BeforeDispatch事件来标识Request.URL字符串,并确定要为相应的datasnap类加载哪些包。
通过使用这种方法,我可以编写一个灵活且可扩展的通用DataSnap应用程序。
在检查DataSnap源代码之后,我发现除非在现有的DataSnap源上做一些额外的工作,否则这是不可能的。 TDSServerMethodProvider类中对注册至关重要的几个方法在私有部分中声明:AddRegisteredServerClasses
,AddAllMethods
。
TDSServerMethodProvider类似乎没有设计用于其他注册。它只允许注册一次。