我正在使用REST和json运行一些Datasnap测试。
Delphi本身创建的Unit ServerMethods中有“ReverseString”功能,但是,我怎么知道谁发送了它?
我想保留调用此方法的客户的信息记录。
我知道它可以作为参数传递,但是客户端有责任将这些信息传递给我,我不想要,让我们说这个方法是公开的,几个客户端会触发这些信息。如果我没有直接通过服务器的控制获得信息,我很容易失去这种控制。
我在网上发现,在ServerConteiner单元中,有一个“DSServer”对象,该对象有一个名为“OnConnect”的事件,因此它可以获取以下sa数据:
Procedure TServerContainer1.DSServer1Connect (
DSConnectEventObject: TDSConnectEventObject);
Begin
DSConnectEventObject.ChannelInfo.ClientInfo.IpAddress;
DSConnectEventObject.ChannelInfo.ClientInfo.ClientPort;
DSConnectEventObject.ChannelInfo.ClientInfo.Protocol;
DSConnectEventObject.ChannelInfo.ClientInfo.AppName;
End;
但我无法找到ServerMethods.ReverseString中的内容,我可以获取此数据......
我认为处理是服务器上的线程,因此我不能将此值作为全局传递,因为它可以从其他同时连接中获取信息。
在方法ReverseString中,我尝试如下:
Var
ADSServerClass: TDSServerClass;
Begin
ADSServerClass: = TDSServerClass (GetOwner);
TDSServer (ADSServerClass.Server). ???
// I got to the server, but I can not find it, and I do not know if it is this way to find the data of who is requesting me to execute the ReverseString
End;
答案 0 :(得分:2)
服务器端会话管理是一种解决方案:DataSnap的高级功能。当客户端连接到DataSnap服务器时,会创建会话。此会话使用TDSSession实例表示。
在会话对象中,例如ip-address。在服务器方法中,您可以从会话对象中读取特定客户端连接的信息。
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Server_Side_Session_Management
答案 1 :(得分:1)
此致
溶液:
Delphi XE5 Rest Datasnap Server. Getting Client IP Address
=iif(MAX(Fields!DistinctDevicecount.Value) > 1, "Solid", "None")
答案 2 :(得分:0)
一个非常脏的解决方案是在ServerContainer上创建线程全局变量
unique_df[unique_df['direction'] == 'left']
因此,您现在可以使用这些变量,每个线程/连接都会看到一组独立的值。
threadvar变量的问题是连接完成后没有清空,可能导致内存泄漏。
因此,为了避免这些泄漏,当您的TMethods数据模块被销毁时,您需要手动清除它们。
threadvar
IpAddress: string;
ClientPort: integer;
Protocol: string;
AppName: string;
我确信它们是更优雅的解决方案,但如果没有其他人提供更好的选择,您可以使用此替代方案。