2
我有一個使用WebBroker的Delphi 6中的ISAPI應用程序。我需要在開始和每個操作結束時添加日誌記錄信息。如何將記錄過濾器添加到WebBroker應用程序?
我試過OnBeforeDispatch和OnAfterDispatch,但有些操作直接向瀏覽器發送響應,並且OnAfterDispatch事件永遠不會被觸發。
有沒有添加過濾器或其他東西的方法,而無需向每個操作添加代碼?
我有一個使用WebBroker的Delphi 6中的ISAPI應用程序。我需要在開始和每個操作結束時添加日誌記錄信息。如何將記錄過濾器添加到WebBroker應用程序?
我試過OnBeforeDispatch和OnAfterDispatch,但有些操作直接向瀏覽器發送響應,並且OnAfterDispatch事件永遠不會被觸發。
有沒有添加過濾器或其他東西的方法,而無需向每個操作添加代碼?
你可以做的一種方法是隻有一個動作。將路徑設置爲「/」,並將操作設置爲默認處理程序。然後:
結束時,我總是做了所有的動作處理引擎適當的內部處理程序行動登記。然後代碼是這樣的
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,但它不是通過繼承來擴展的,因爲它的大多數方法都是靜態的。實現結果的唯一方法是做大量的複製/粘貼來複制類。您的解決方案似乎是更好的選擇。謝謝! – danhakin 2012-03-26 16:50:30
沒問題。這對我很有效。 – Runner 2012-03-26 17:43:46