DataSnap中的客户端应用程序名称

时间:2016-11-13 06:59:35

标签: delphi datasnap

我有使用DataSnap的客户端 - 服务器系统。我想记录客户端应用程序数据,因此我使用TDSServer - OnConnect事件。在这种情况下,我可以使用以下代码访问我想要的内容:

IP:= DSConnectEventObject.ChannelInfo.ClientInfo.IpAddress  
ClientPort:= DSConnectEventObject.ChannelInfo.ClientInfo.ClientPort  
Protocol:= DSConnectEventObject.ChannelInfo.ClientInfo.Protocol  
AppName:= DSConnectEventObject.ChannelInfo.ClientInfo.AppName  

前3行正常,但AppName为空!!!

(我在同一台计算机上运行服务器和客户端,即localhost)

1 个答案:

答案 0 :(得分:3)

当客户端通过TCP / IP连接时,我无法找到有关如何指定AppName的任何在线信息。如果你看代码

procedure TDSTCPChannel.Open;
var
  ClientInfo: TDBXClientInfo;
begin
  inherited;
  FreeAndNil(FChannelInfo);
  FChannelInfo := TDBXSocketChannelInfo.Create(IntPtr(FContext.Connection), FContext.Connection.Socket.Binding.PeerIP);

  ClientInfo := FChannelInfo.ClientInfo;

  ClientInfo.IpAddress := FContext.Connection.Socket.Binding.PeerIP;
  ClientInfo.ClientPort := IntToStr(FContext.Connection.Socket.Binding.PeerPort);
  ClientInfo.Protocol := 'tcp/ip';

  FChannelInfo.ClientInfo := ClientInfo;
end;
<{1>} DataSnap.DSTCPServerTransport.Pas显然没有设置ClientInfo.AppName。

但是,以下解决方法适用于Seattle演示DataSnap Basic Server + Client:

  1. 在客户端中,添加一个Param&#39; AppName&#39;到SqlConnection1组件的参数和 将其值设置为类似于&#39; MyTestApp&#39;。重新编译客户端。

  2. 在IDE中打开服务器并修改ServerContainerForm的代码,如下所示。

  3. 代码:

    uses
       [...], DBXTransport;
    
    procedure TForm8.DSServer1Connect(DSConnectEventObject: TDSConnectEventObject);
    var
      S : String;  //  added
      Info : TDBXClientInfo;  //  added
    begin
       ActiveConnections.Insert;
       if DSConnectEventObject.ChannelInfo <> nil then
       begin
         ActiveConnections['ID'] := DSConnectEventObject.ChannelInfo.Id;
         ActiveConnections['Info'] := DSConnectEventObject.ChannelInfo.Info;
       end;
       ActiveConnections['UserName'] := DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName];
       ActiveConnections['ServerConnection'] := DSConnectEventObject.ConnectProperties[TDBXPropertyNames.ServerConnection];
       ActiveConnections.Post;
    
       InsertEvent('Connect');
    
       //  following added to get AppName from client
    
       S := DSConnectEventObject.ConnectProperties['AppName'];
       Info := DSConnectEventObject.ChannelInfo.ClientInfo;
       Info.AppName := S;
    
       DSConnectEventObject.ChannelInfo.ClientInfo := Info;
       Caption :=  DSConnectEventObject.ChannelInfo.ClientInfo.AppName;
    end;
    

    正如您所看到的,它通过在客户端中获取AppName的值来工作 在{DSConnectEventObject.ConnectProperties [&#39; AppName&#39;]&#39;的调用中SqlConnection1.Params 然后将其显示在ServerContainerForm的标题上。

    显然,您可以通过将其添加到客户端上的SqlConnection的Params来传递任何其他名称/值对,然后通过调用DSConnectEventObject.ConnectProperties[]在服务器上提取它们。