3

我正在尝试使用带有以下代码 DSServer的事件获取客户端的 IP 地址和其他客户端信息。onconnect

我的问题是DSConnectEventObject.ChannelInfo每次nil都是这样。此外,我无法解析 IP 地址。

请帮我。谢谢你。

procedure TWebModule1.DSServer1Connect(DSConnectEventObject: TDSConnectEventObject);
var
     ci: TDBXClientInfo;
begin
     ci := DSConnectEventObject.ChannelInfo.ClientInfo;
     AddLog(Format('Client %s Connected IP: %s, Port: %s', 
         [ci.Protocol, ci.IpAddress, ci.ClientPort])
     );
end;
4

4 回答 4

2

如前所述,这是 DataSnap 中的一个错误。它在 XE2 中运行良好,但错误出现在 XE3 和 XE5 之间。它已在 QC 报告 #121931 和 #126164 中报告。幸运的是,客户端连接属性在 Session 对象中可用 - 见下文:

var
  Session: TDSSession;
  Protocol, IpAddress, AppName: string;
begin
  Session := TDSSessionManager.GetThreadSession;
  Protocol := Session.GetData('CommunicationProtocol');
  IpAddress := Session.GetData('RemoteIP');
  AppName := Session.GetData('RemoteAppName');
end;
于 2014-07-16T15:30:01.170 回答
1

这个怎么样?

在 WebMoudle 单元中,

保存IP:

implementation
threadvar remoteIP: string;

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  remoteIP := Request.RemoteAddr;
end;

procedure TWebModule1.DSServer1Connect(DSConnectEventObject: TDSConnectEventObject);
begin
  TDSSessionManager.GetThreadSession.PutData('RemoteAddr', remoteIP);
end;

procedure TWebModule1.DSServer1Disconnect(DSConnectEventObject: TDSConnectEventObject);
begin
  remoteIP := '';
end;
于 2013-12-12T05:10:33.067 回答
0

这是错误
您可以执行以下代码:

procedure TWebModule.DSServerConnect(
  DSConnectEventObject: TDSConnectEventObject);
var _Session: TDSSession;
begin
  try
    if Assigned(DSConnectEventObject.ChannelInfo) then
    begin
      _Session := TDSSessionManager.GetThreadSession;
      if Assigned(_Session) then
      begin
        if _Session.GetData('RemoteAddr') = '' then
          _Session.PutData('RemoteAddr', DSConnectEventObject.ChannelInfo.Info);
      end;
    end;
  except
  end;
end;
于 2014-01-28T03:56:27.947 回答
0

DataSnap REST ISAPI dll


在 WebMoudle 单元中,

保存IP:

TDSSessionManager.GetThreadSession.PutData('RemoteAddr',Request.RemoteAddr);


在其他单位,

获取IP:

uIP := TDSSessionManager.GetThreadSession.GetData('RemoteAddr');


于 2013-10-12T08:40:12.867 回答