2017-06-07 4 views
0

私はいくつかのDatasnapテストをRESTとjsonで実行しています。Delphi DataSnap Rest

ユニットServerMethodsには、Delphi自身が作成する「ReverseString」機能がありますが、どのように送信したのかをどのように知ることができますか?

このメソッドを呼び出したクライアントからの情報のログを保持したいと思います。

私はパラメータとして渡すことができますが、この情報を私に渡すのはクライアントの責任であることを私は望んでいません。メソッドが公開され、いくつかのクライアントがこの情報。私は簡単にこのコントロールを失うことができます、私は直接サーバーの制御によって情報を取得しない場合。

Procedure TServerContainer1.DSServer1Connect (
    DSConnectEventObject: TDSConnectEventObject); 
Begin 
    DSConnectEventObject.ChannelInfo.ClientInfo.IpAddress; 
    DSConnectEventObject.ChannelInfo.ClientInfo.ClientPort; 
    DSConnectEventObject.ChannelInfo.ClientInfo.Protocol; 
    DSConnectEventObject.ChannelInfo.ClientInfo.AppName; 
End; 

しかし:

私はServerConteinerユニットで、「dsserverの」オブジェクトを持っていることを、このオブジェクトは「のOnConnect」というイベントがあり、それは以下のSAデータを得ることができるので、ウェブ上で発見しました私はServerMethods.ReverseStringにどのようにこのデータを取得することができます見つけることができません...

私は処理がサーバー上のスレッド内にあると思うので、私はそれを選ぶことができるので、グローバルとしてこの値を渡すことはできません他の同時接続からのアップ情報を含む。次のような方法で

、ReverseStringは、私が試した:

Var 
    ADSServerClass: TDSServerClass; 
Begin 
    ADSServerClass: = TDSServerClass (GetOwner); 
    TDSServer (ADSServerClass.Server). ??? 
    // I got to the server, but I can not find it, and I do not know if it is this way to find the data of who is requesting me to execute the ReverseString 
End; 
+0

あなたが検索した場合は - あなたのDelphiのサンプル\ Object Pascalの\ DataSnapのフォルダにReverseString用ファイル内のファイルを、 ReverseStringメソッドを呼び出すさまざまなデモに移動します。また、Googleのdelphiの「servermethods」チュートリアルの場合は、次のようなものがあります。https://www.youtube.com/watch?v=C8iqCk4O6Tg – MartynA

+0

私は同様のことを試みて失敗しました。 「接続レベル」情報(servercontainerunit)は、「アプリケーションレベル」(servermethodsunit)では使用できません。 – nolaspeaker

答えて

0

を非常に汚いソリューションは、あなたが今、これらの変数を使用することができ、あなたのServerContainerのスレッドグローバル変数

threadvar 
    IpAddress: string; 
    ClientPort: integer; 
    Protocol: string; 
    AppName: string; 

を作成することで、スレッド/接続ごとに独立した値のセットが表示されます。

threadvar変数の問題は、接続が完了したときに空でなくなり、潜在的にメモリリークが発生することです。

これらのリークを避けるには、TMethodsデータモジュールが破棄されたときに手動で消去する必要があります。

procedure TMyMethods.DataModuleDestroy(Sender: TObject); 
begin 
    if DatabaseCn.Connected then DatabaseCn.Close; 
    IpAddress := ''; 
    ClientPort := 0; 
    Protocol := ''; 
    AppName := ''; 
end; 

私は、彼らははるかにエレガントなソリューションであると確信しているが、誰もがより良い選択肢を提供していない場合は、この代替手段を使用することができます。

+0

ありがとうございます。しかし、DataSnapサーバーはWindowsサービスのままにしておくことが考えられます。メモリが溜まると、今後の問題が発生します。 私はまた私の環境の中でいくつかのアイテムを公開しようとしています。 –

2

サーバーサイドのセッション管理は、ソリューションであり、DataSnapの高度な機能です。クライアントがDataSnapサーバーに接続すると、セッションが作成されます。このセッションは、TDSSessionインスタンスで表されます。

セッションオブジェクトには、たとえばip-addressを入れます。サーバーメソッドでは、セッションオブジェクトから特定のクライアント接続の情報を読み取ることができます。

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Server_Side_Session_Management

1

よろしく、

ソリューション:

Delphi XE5 Rest Datasnap Server. Getting Client IP Address

var 
    Session: TDSSession; 
    Protocol, IpAddress, AppName: string; 
begin 
    Session := TDSSessionManager.GetThreadSession; 
    Protocol := Session.GetData('CommunicationProtocol'); 
    IpAddress := Session.GetData('RemoteIP'); 
    AppName := Session.GetData('RemoteAppName'); 
end; 
+0

http://blog.atlabs.com.br/2017/06/delphi-pegando-o-ip-do-cliente-em-um.html –

+0

悲しいことに、これはDelphi 10.1では動作しません。これらの変数は常に空です:-(。 –

+1

こんにちは、投稿の冒頭で引用した変数は空です。 "Solution"と書かれた投稿をチェックするか、私のブログhttp://blog.atlabsに掲載されているソリューションにアクセスしてください.com.br/2017/06/delphi-pegando-o-ip-do-cliente-em-um.html これは機能しており、私はそれを使用しています。 –

関連する問題