2012-06-13 3 views
1

Я строю сервер XE2 DataSnap, который будет обслуживать соединения с клиентами REST. Свойству DOServerClass LifeCycle присвоено значение «Invocation». То, что я хочу сделать, - это зарегистрировать информацию о всех клиентских подключениях к серверу, включая следующие данные: имя пользователя, IP-адрес, протокол, имя приложения. Я могу в настоящее время получить эти данные с помощью следующих событий:Сервер данных DataSnap Delphi XE2 - Пользователь/свойства подключения клиента клиента

DSAuthenticationManager - UserAuthenticate(): имя пользователя, протокол (используя стандартные параметры, передаваемые в)

DSServer - Connect) (: протокол, 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» в качестве жизненного цикла сервера? –

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; 
Смежные вопросы