我正在构建一个XE2 DataSnap服务器,它将为REST客户端提供连接。我的DSServerClass LifeCycle属性设置为“Invocation”。我想要做的是记录服务器的所有客户端连接的详细信息,包括以下详细信息:用户名,IP地址,协议,应用程序名称。我目前可以使用以下事件获取这些详细信息:
DSAuthenticationManager - UserAuthenticate():用户名,协议(使用传入的标准参数)
DSServer - Connect():协议,IP地址,应用程序名称(使用DSConnectEventObject.ChannelInfo.ClientInfo)
我想要做的只是记录一次所有细节,但似乎我无法在一个事件中获得我需要的所有细节。我尝试在类中使用共享私有变量,但正如预期的那样,这会产生不一致的结果 - 错误的用户名错误的IP地址。还有另一种方法可以达到我的目的吗?
乔纳森
答案 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];