【问题标题】:Delphi XE5 Rest Datasnap Server. Getting Client IP AddressDelphi XE5 Rest Datasnap 服务器。获取客户端 IP 地址
【发布时间】:2013-10-10 14:57:49
【问题描述】:

我正在尝试使用带有以下代码的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;

【问题讨论】:

    标签: delphi rest client datasnap


    【解决方案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;
    

    【讨论】:

      【解决方案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;
      

      【讨论】:

        【解决方案3】:

        DataSnap REST ISAPI dll


        在 WebMoudle 单元中,

        保存IP:

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


        在其他单位,

        获取IP:

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


        【讨论】:

          【解决方案4】:

          这是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() 将是错误的,因此其余代码将无关紧要。
          • 但是,调用DSConnectEventobject.ChannelInfo时并不总是出现nil。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多