我有使用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)
答案 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:
在客户端中,添加一个Param&#39; AppName&#39;到SqlConnection1组件的参数和 将其值设置为类似于&#39; MyTestApp&#39;。重新编译客户端。
在IDE中打开服务器并修改ServerContainerForm的代码,如下所示。
代码:
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[]
在服务器上提取它们。