Delphi XE2 DataSnap Server - 记录客户端连接用户/属性

时间:2012-06-13 08:59:56

标签: delphi http rest delphi-xe2 datasnap

我正在构建一个XE2 DataSnap服务器,它将为REST客户端提供连接。我的DSServerClass LifeCycle属性设置为“Invocation”。我想要做的是记录服务器的所有客户端连接的详细信息,包括以下详细信息:用户名,IP地址,协议,应用程序名称。我目前可以使用以下事件获取这些详细信息:

DSAuthenticationManager - UserAuthenticate():用户名,协议(使用传入的标准参数)

DSServer - Connect():协议,IP地址,应用程序名称(使用DSConnectEventObject.ChannelInfo.ClientInfo)

我想要做的只是记录一次所有细节,但似乎我无法在一个事件中获得我需要的所有细节。我尝试在类中使用共享私有变量,但正如预期的那样,这会产生不一致的结果 - 错误的用户名错误的IP地址。还有另一种方法可以达到我的目的吗?

乔纳森

2 个答案:

答案 0 :(得分:3)

procedure TServerContainer1.DSServer1Connect(DSConnectEventObject: TDSConnectEventObject);
begin
  Form1.Memo1.Lines.Add(Format('Conn->UserName=%s, Password=%s', [
    DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName],
    DSConnectEventObject.ConnectProperties[TDBXPropertyNames.Password]
    ]));
  // 取 Client 端的IP 和 Port
  Form1.Memo1.Lines.Add('IP =' + DSConnectEventObject.ChannelInfo.ClientInfo.IpAddress + ':'
    + DSConnectEventObject.ChannelInfo.ClientInfo.ClientPort);
end;

答案 1 :(得分:2)

您可以使用TDSServer.OnConnect事件(在TDSAuthenticationManager.OnUserAuthenticate之后调用)。在那里,您可以访问ChannelInfo.ClientInfo,也可以ConnectProperties从中读取属性值,如下所示:

  Scheme := ConnectProperties.Values[TDBXPropertyNames.DSAuthenticationScheme];
  UserName := ConnectProperties.Values[TDBXPropertyNames.DSAuthenticationUser];
  Password := ConnectProperties.Values[TDBXPropertyNames.DSAuthenticationPassword];