Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何将日志过滤器添加到WebBroker应用程序?_Delphi - Fatal编程技术网

Delphi 如何将日志过滤器添加到WebBroker应用程序?

Delphi 如何将日志过滤器添加到WebBroker应用程序?,delphi,Delphi,我在Delphi6中有一个使用WebBroker的ISAPI应用程序。我需要在每个操作的末尾添加日志信息 我尝试了OnBeforeDispatch和OnAfterDispatch,但有些操作将响应直接发送到浏览器,并且OnAfterDispatch事件从未触发 有没有一种方法可以添加过滤器或其他东西,而不必为每个操作添加代码?一种方法是只添加一个操作。将路径设置为“/”并将操作设置为默认处理程序。然后: 记录操作的开始 从URL调用指定的相应内部处理程序 记录操作的结束 我总是做一个所有动作都已

我在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;
    

    你应该能够从这一切中理解这个原理。

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

  • 记录操作的开始
  • 从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;
    

    您应该能够从所有这些中理解原理。

    这是一种有趣的方法。起初,我尝试将TCustomWebDispatcher子类化,但由于它的大多数方法都是静态的,所以它的设计不是通过继承来扩展的。实现结果的唯一方法是大量复制/粘贴以复制该类。您的解决方案似乎是一个更好的选择。谢谢这是一个有趣的方法。起初,我尝试将TCustomWebDispatcher子类化,但由于它的大多数方法都是静态的,所以它的设计不是通过继承来扩展的。实现结果的唯一方法是大量复制/粘贴以复制该类。您的解决方案似乎是一个更好的选择。谢谢