Delphi DataSnap Rest

Delphi DataSnap Rest,rest,delphi,datasnap,Rest,Delphi,Datasnap,我正在用REST和json运行一些Datasnap测试 Delphi自己创建的UnitServerMethods中有“ReverseString”功能,但我怎么知道是谁发送的呢 我想保存调用此方法的客户端的信息日志 我知道它可以作为参数传递,但是客户端有责任将此信息传递给我,我不希望这样,假设该方法是公开的,并且有几个客户端将触发此信息。如果我不能通过服务器的控制直接获取信息,我很容易失去这种控制 我在web上发现,在ServerContenner单元中,有一个“DSServer”对象,该对象有

我正在用REST和json运行一些Datasnap测试

Delphi自己创建的UnitServerMethods中有“ReverseString”功能,但我怎么知道是谁发送的呢

我想保存调用此方法的客户端的信息日志

我知道它可以作为参数传递,但是客户端有责任将此信息传递给我,我不希望这样,假设该方法是公开的,并且有几个客户端将触发此信息。如果我不能通过服务器的控制直接获取信息,我很容易失去这种控制

我在web上发现,在ServerContenner单元中,有一个“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;

一个非常糟糕的解决方案是在ServerContainer上创建线程全局变量

threadvar
  IpAddress: string;   
  ClientPort: integer;
  Protocol: string;
  AppName: string;
因此,您现在可以使用这些变量,您将看到每个线程/连接的一组独立的值

threadvar变量的问题是,连接完成时没有清空,这可能导致内存泄漏

因此,为了避免这些泄漏,您需要在TMethods数据模块被销毁时手动清除它们

procedure TMyMethods.DataModuleDestroy(Sender: TObject);
begin
  if DatabaseCn.Connected then DatabaseCn.Close;
  IpAddress := '';
  ClientPort := 0;
  Protocol := '';
  AppName := '';
end;

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

一个非常肮脏的解决方案是在ServerContainer上创建线程全局变量

threadvar
  IpAddress: string;   
  ClientPort: integer;
  Protocol: string;
  AppName: string;
因此,您现在可以使用这些变量,您将看到每个线程/连接的一组独立的值

threadvar变量的问题是,连接完成时没有清空,这可能导致内存泄漏

因此,为了避免这些泄漏,您需要在TMethods数据模块被销毁时手动清除它们

procedure TMyMethods.DataModuleDestroy(Sender: TObject);
begin
  if DatabaseCn.Connected then DatabaseCn.Close;
  IpAddress := '';
  ClientPort := 0;
  Protocol := '';
  AppName := '';
end;

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

服务器端会话管理是一种解决方案:DataSnap的高级功能。当客户端连接到DataSnap服务器时,将创建一个会话。此会话由TDSSession实例表示

在会话对象中输入例如ip地址。在服务器方法中,您可以从会话对象中读取特定客户端连接的信息


服务器端会话管理是一种解决方案:DataSnap的高级功能。当客户端连接到DataSnap服务器时,将创建一个会话。此会话由TDSSession实例表示

在会话对象中输入例如ip地址。在服务器方法中,您可以从会话对象中读取特定客户端连接的信息

关于

解决方案:

问候,

解决方案:


如果您在Delphi Samples\Object Pascal\DataSnap文件夹中搜索-Files in Files for ReverseString,它将带您进入调用ReverseString方法的各种演示。另外,如果你在谷歌上搜索delphi“servermethods”教程,你会发现类似的情况:我尝试过做类似的事情,但失败了。“连接级别”信息(servercontainerunit)在“应用程序级别”(servermethodsunit)中不可用。如果您在Delphi Samples\Object Pascal\DataSnap文件夹中搜索-Files in Files for ReverseString,它将带您到调用ReverseString方法的各种演示。另外,如果你在谷歌上搜索delphi“servermethods”教程,你会发现类似的情况:我尝试过做类似的事情,但失败了。“连接级别”信息(servercontainerunit)在“应用程序级别”(servermethodsunit)中不可用。谢谢,但我们的想法是让DataSnap服务器保持windows服务的状态,如果内存累积,我将来会遇到问题。我还在我的环境中尝试一些项目,这些项目也已公开。谢谢,但我的想法是让DataSnap服务器保持windows服务的状态,如果内存累积,我将来会遇到问题。我还在我的环境中尝试一些项目,也公开了。遗憾的是,这在Delphi10.1上不起作用。这些变量总是空的:-(.您好,我在文章开头引用的变量都是空的,请检查文章中写的“解决方案”,或者访问我博客上发布的解决方案:它正在工作,我正在使用它。遗憾的是,这在Delphi 10.1上不起作用。这些变量总是空的:-(.您好,我在文章开头引用的变量是空的,请检查文章中写的“解决方案”,或者访问我博客上发布的解决方案:它正在工作,我正在使用它。