1

RESTクライアントからの接続を提供するXE2DataSnapサーバーを構築しています。DSServerClassLifeCycleプロパティが「Invocation」に設定されています。私がやりたいのは、サーバーへのすべてのクライアント接続の詳細をログに記録することです。これには、ユーザー名、IPアドレス、プロトコル、アプリケーション名などの詳細が含まれます。現在、次のイベントを使用してこれらの詳細を取得できます。

DSAuthenticationManager-UserAuthenticate():ユーザー名、プロトコル(渡された標準パラメーターを使用)

DSServer-Connect():プロトコル、IPアドレス、アプリケーション名(DSConnectEventObject.ChannelInfo.ClientInfoを使用)

私がやりたいのは、すべての詳細を1回ログに記録することですが、1つのイベントで必要なすべての詳細を取得できないようです。クラスで共有プライベート変数を使用しようとしましたが、予想どおり、一貫性のない結果が得られました。間違ったユーザー名に対して間違った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.OnUserAuthenticateChannelInfo.ClientInfoそこで、発見したとおりにアクセスでき、そこConnectPropertiesから次のようなプロパティ値を読み取ることもできます。

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