Delphi XE5 Rest Datasnap Server。获取客户端IP地址

时间:2013-10-10 14:57:49

标签: delphi rest client datasnap

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

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

请帮帮我。谢谢。

nil

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

DataSnap REST ISAPI dll


在WebMoudle单元中,

保存IP:

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


在其他单位,

获取IP:

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


答案 2 :(得分:0)

怎么样?

在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;

答案 3 :(得分: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;