在Datasnap REST服务(ISAPI模块)上,我希望能够知道调用的方法。我将在通用例程中使用它来在发生的每个错误/异常上写入日志。
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事件的Request param上的服务的WebModule上获得。
但是我无法在会话数据中设置该值(因此我的WriteLog例程可以访问它),因为那时还没有会话。
此代码引发AV:
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;
目前我在WebModule上设置了一个 threadvar 变量来保存这个值,因此WriteLog例程可以访问它。
它有效,但全局变量是一个非常难看的解决方案,更重要的是,它会在每次调用后导致小内存泄漏。
你认为我能在哪里保存这个价值,以便在需要时能够阅读?
谢谢。
答案 0 :(得分:1)
我认为可以从DSAuthenticationManagerUserAuthorize事件中的EventObject.MethodAlias访问它。