我正在尝试使用DSServer
的{{1}}事件使用以下代码获取客户端的IP地址和其他客户端信息。
我的问题是onconnect
每次都是DSConnectEventObject.ChannelInfo
。此外,我无法解析IP地址。
请帮帮我。谢谢。
nil
答案 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;