2012-06-13 105 views
1

我正在构建一个XE2 DataSnap服务器,它将服务于来自REST客户端的连接。我的DSServerClass LifeCycle属性设置为“调用”。我想要做的是将所有客户端连接的详细信息记录到服务器上,包括以下详细信息:用户名,IP地址,协议和应用程序名称。 UserAuthenticate() -Delphi XE2 DataSnap服务器 - 日志客户端连接用户/属性

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

与dsserver - 连接():我可以采用下列事件目前得到这些细节的协议,IP地址,应用程序名称(使用DSConnectEventObject.ChannelInfo.ClientInfo)

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

乔纳森

回答

2

您可以使用TDSServer.OnConnect事件(这是TDSAuthenticationManager.OnUserAuthenticate之后调用)。在那里,你可以访问ChannelInfo.ClientInfo因为你已经发现了,也ConnectProperties,从中可以读出的属性值是这样的:

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

嗨,为响应千恩万谢。不幸的是,只是尝试这些属性值,他们返回空白字符串,我错过了别的东西? –

+0

在我的测试中,'DSAuthenticationUser'和'DSAuthenticationPassword'返回的值与之前传递给'OnUserAuthenticate'事件的值相同。 –

+0

您是否使用'Invocation'作为服务器LifeCycle? –

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; 
相关问题