1

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

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

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

我想要做的只是为所有详细信息记录一次,但似乎我无法在一个事件中获得我需要的所有详细信息。我尝试在类中使用共享私有变量,但正如预期的那样,这会产生不一致的结果——错误的 IP 地址与错误的用户名。还有其他方法可以实现我想要的吗?

乔纳森

4

2 回答 2

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;
于 2012-09-27T15:02:23.397 回答
2

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

  Scheme := ConnectProperties.Values[TDBXPropertyNames.DSAuthenticationScheme];
  UserName := ConnectProperties.Values[TDBXPropertyNames.DSAuthenticationUser];
  Password := ConnectProperties.Values[TDBXPropertyNames.DSAuthenticationPassword];
于 2012-06-13T09:34:16.323 回答