2016-10-19 20 views
0

Datasnap RESTサービス(ISAPIモジュール)では、呼び出されたメソッドを知りたいと思っています。私はジェネリックルーチンでそれを使用して、起こったすべてのエラー/例外に対してログを書きます。Datasnap RESTサービスで呼び出されるメソッドを知る方法

procedure WriteLog(Error: string); 
var Log, Service, LogFile: string; 
begin 
    Service := ExtractFileName(GetModuleName(HInstance)); 
    Service := Copy(Service, 1, Service.Length - 4); 
    if not TDirectory.Exists('C:\Logs') then TDirectory.CreateDirectory('C:\Logs'); 
    if not TDirectory.Exists('C:\Logs\' + Service) then TDirectory.CreateDirectory('C:\Logs\' + Service); 
    LogFile := 'C:\Logs\' + Service + '\' + FormatDateTime('yyyy-mm-dd_hh-nn-zzz', Now) + '.txt'; 

    Log := 'Call : ' + XXXXXX + sLineBreak; 
    Log := Log + 'User : ' + TDSSessionManager.GetThreadSession.GetData('User') + sLineBreak; 
    Log := Log + 'IP : ' + TDSSessionManager.GetThreadSession.GetData('RemoteIP') + sLineBreak; 
    Log := Log + 'Error : ' + sLineBreak + Error; 
    TFile.WriteAllText(LogFile, Log); 
end; 

私はXXXXXXを呼び出すメソッドの名前に置き換える必要があります。

この情報は、WebModuleBeforeDispatchイベントのリクエストパラメータで、サービスのWebModuleで利用できます。

しかし、セッションデータにその値を設定することはできません(そのため、WriteLogルーチンでアクセスできるようになります)。その時点でまだセッションが存在しないためです。私はそれがWRITELOGルーチンのためにアクセスできるように、この値を保持するためにWebModuleにthreadvar変数が設定されている現時点で

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    Response.SetCustomHeader('Access-Control-Allow-Origin','*'); 

    if Trim(Request.GetFieldByName('Access-Control-Request-Headers')) <> '' then begin 
    Response.SetCustomHeader('Access-Control-Allow-Headers', Request.GetFieldByName('Access-Control-Request-Headers')); 
    Handled := True; // I answer to CORS calls 
    end; 

    TDSSessionManager.GetThreadSession.PutData('MethodCalled', Request.PathInfo); 

    if FServerFunctionInvokerAction <> nil then 
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker; 
end; 

このコードは、AVを発生させます。

グローバル変数は非常に醜い解決策です。さらに重要なことは、呼び出しごとに小さなメモリリークが発生することです。

私はそれが必要な時に私がそれを読むことができるように、私はその価値を保存することができると思いますか?

ありがとうございます。

+1

私たちの残りの部分と同様に、サーバのすべてのメソッドにWriteLogを挿入するだけでよいでしょう。 – nolaspeaker

答えて

1

DSAuthenticationManagerUserAuthorizeイベントのEventObject.MethodAliasからアクセスできると思います。

関連する問題