如何将日志记录筛选器添加到WebBroker应用程序?

时间:2012-03-23 13:07:20

标签: delphi

我在Delphi 6中有一个使用WebBroker的ISAPI应用程序。我需要在每个Action的开始和结束时添加日志记录信息。

我尝试过OnBeforeDispatch和OnAfterDispatch,但有些操作会将响应直接发送到浏览器,并且永远不会触发OnAfterDispatch事件。

有没有办法在不必为每个操作添加代码的情况下添加过滤器或其他内容?

1 个答案:

答案 0 :(得分:0)

您可以做到的一种方法是只有一个动作。将路径设置为“/”并将操作设置为默认处理程序。然后:

  1. 记录行动的开始
  2. 从URL调用您指定的相应内部处理程序
  3. 记录操作结束
  4. 我总是做一个已注册所有操作的动作处理程序引擎。然后代码就像这样

    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;
    

    你应该能够理解这一切的原则。