Delphi XE5 Rest Datasnap服务器。获取客户端IP地址

3
我正在尝试使用以下代码通过DSServeronconnect事件获得客户端的IP地址和其他客户端信息。但我的问题是,每次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个回答

2

如前所述,这是DataSnap中的一个错误。在XE2中它工作得很好,但在XE3和XE5之间出现了错误。它已经在QC报告#121931和#126164中报告。幸运的是,客户端连接属性可以在会话对象中获得 - 请参见下面:

var
  Session: TDSSession;
  Protocol, IpAddress, AppName: string;
begin
  Session := TDSSessionManager.GetThreadSession;
  Protocol := Session.GetData('CommunicationProtocol');
  IpAddress := Session.GetData('RemoteIP');
  AppName := Session.GetData('RemoteAppName');
end;

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;

0

这是Bug
你可以在下面的代码中实现:

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;

该OP表示DSConnectEventObject.ChannelInfo为空,所以您的第一个if Assigned()将返回false,因此代码的其余部分将无关紧要。 - Remy Lebeau
但是,当调用DSConnectEventobject.ChannelInfo时,并不总是会出现nil。 - Eden Wu

0

DataSnap REST ISAPI dll


在WebMoudle单元中,

保存IP地址:

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


在其他单元中,

获取IP:

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



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接