Delphi 如何将日志过滤器添加到WebBroker应用程序?
我在Delphi6中有一个使用WebBroker的ISAPI应用程序。我需要在每个操作的末尾添加日志信息 我尝试了OnBeforeDispatch和OnAfterDispatch,但有些操作将响应直接发送到浏览器,并且OnAfterDispatch事件从未触发Delphi 如何将日志过滤器添加到WebBroker应用程序?,delphi,Delphi,我在Delphi6中有一个使用WebBroker的ISAPI应用程序。我需要在每个操作的末尾添加日志信息 我尝试了OnBeforeDispatch和OnAfterDispatch,但有些操作将响应直接发送到浏览器,并且OnAfterDispatch事件从未触发 有没有一种方法可以添加过滤器或其他东西,而不必为每个操作添加代码?一种方法是只添加一个操作。将路径设置为“/”并将操作设置为默认处理程序。然后: 记录操作的开始 从URL调用指定的相应内部处理程序 记录操作的结束 我总是做一个所有动作都已
有没有一种方法可以添加过滤器或其他东西,而不必为每个操作添加代码?一种方法是只添加一个操作。将路径设置为“/”并将操作设置为默认处理程序。然后:
procedure TwmWebModule.wmWebModuleActionHandlerAction(Sender: TObject;
Request: TWebRequest;
Response: TWebResponse;
var Handled: Boolean);
var
HandlerID: string;
begin
HandlerID := StringReplace(string(Request.InternalPathInfo), '/', '', []);
FHandlerEngine.ExecuteHandler(HandlerID, Request, Response);
end;
现在只需添加日志:)这还有其他好处。然后,每个处理程序都在自己的单元中,您可以实现某种MVC方法。代码更干净,更易于维护
骨架如下所示:
TCustomHandler = class
private
FHandlerID: string;
FHandlerSettings: ISimpleStorage;
protected
procedure Execute(const Request: TWebRequest; const Response: TWebResponse); virtual; abstract;
public
constructor Create(const ID: string);
property HandlerID: string read FHandlerID;
property HandlerSettings: ISimpleStorage read FHandlerSettings;
end;
THandlerEngine = class
private
FHandlersList: TObjectList;
FRegisteredHandlers: THashTable;
protected
public
constructor Create;
destructor Destroy; override;
procedure RegisterHandlers;
procedure AddSingleHandler(const ID: string; const Handler: TCustomHandler);
procedure ExecuteHandler(const ID: string; const Request: TWebRequest; const Response: TWebResponse);
end;
你应该能够从这一切中理解这个原理。你可以做到的一个方法是只有一个动作。将路径设置为“/”并将操作设置为默认处理程序。然后:
procedure TwmWebModule.wmWebModuleActionHandlerAction(Sender: TObject;
Request: TWebRequest;
Response: TWebResponse;
var Handled: Boolean);
var
HandlerID: string;
begin
HandlerID := StringReplace(string(Request.InternalPathInfo), '/', '', []);
FHandlerEngine.ExecuteHandler(HandlerID, Request, Response);
end;
现在只需添加日志:)这还有其他好处。然后,每个处理程序都在自己的单元中,您可以实现某种MVC方法。代码更干净,更易于维护
骨架如下所示:
TCustomHandler = class
private
FHandlerID: string;
FHandlerSettings: ISimpleStorage;
protected
procedure Execute(const Request: TWebRequest; const Response: TWebResponse); virtual; abstract;
public
constructor Create(const ID: string);
property HandlerID: string read FHandlerID;
property HandlerSettings: ISimpleStorage read FHandlerSettings;
end;
THandlerEngine = class
private
FHandlersList: TObjectList;
FRegisteredHandlers: THashTable;
protected
public
constructor Create;
destructor Destroy; override;
procedure RegisterHandlers;
procedure AddSingleHandler(const ID: string; const Handler: TCustomHandler);
procedure ExecuteHandler(const ID: string; const Request: TWebRequest; const Response: TWebResponse);
end;
您应该能够从所有这些中理解原理。这是一种有趣的方法。起初,我尝试将TCustomWebDispatcher子类化,但由于它的大多数方法都是静态的,所以它的设计不是通过继承来扩展的。实现结果的唯一方法是大量复制/粘贴以复制该类。您的解决方案似乎是一个更好的选择。谢谢这是一个有趣的方法。起初,我尝试将TCustomWebDispatcher子类化,但由于它的大多数方法都是静态的,所以它的设计不是通过继承来扩展的。实现结果的唯一方法是大量复制/粘贴以复制该类。您的解决方案似乎是一个更好的选择。谢谢