Delphi DataSnap Rest

时间:2017-06-07 16:18:34

标签: rest delphi datasnap

我正在使用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;

3 个答案:

答案 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;

我确信它们是更优雅的解决方案,但如果没有其他人提供更好的选择,您可以使用此替代方案。