2012-03-23 74 views
2

我有一個使用WebBroker的Delphi 6中的ISAPI應用程序。我需要在開始和每個操作結束時添加日誌記錄信息。如何將記錄過濾器添加到WebBroker應用程序?

我試過OnBeforeDispatch和OnAfterDispatch,但有些操作直接向瀏覽器發送響應,並且OnAfterDispatch事件永遠不會被觸發。

有沒有添加過濾器或其他東西的方法,而無需向每個操作添加代碼?

回答

0

你可以做的一種方法是隻有一個動作。將路徑設置爲「/」,並將操作設置爲默認處理程序。然後:

  1. 日誌動作
  2. 從URL的開始叫你指定
  3. 登錄行動

結束時,我總是做了所有的動作處理引擎適當的內部處理程序行動登記。然後代碼是這樣的

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; 

您應該能夠從所有這一切明白一個道理。

+0

這是一個有趣的方法。起初,我嘗試了繼承TCustomWebDispatcher,但它不是通過繼承來擴展的,因爲它的大多數方法都是靜態的。實現結果的唯一方法是做大量的複製/粘貼來複制類。您的解決方案似乎是更好的選擇。謝謝! – danhakin 2012-03-26 16:50:30

+0

沒問題。這對我很有效。 – Runner 2012-03-26 17:43:46

相關問題