• 读DataSnap源代码(三)


     1 function TWebRequestHandler.HandleRequest(Request: TWebRequest;
     2   Response: TWebResponse): Boolean;
     3 var
     4   I: Integer;
     5   LWebModule: TComponent;
     6   LWebAppServices: IWebAppServices;
     7   LGetWebAppServices: IGetWebAppServices;
     8   LComponent: TComponent;
     9 begin
    10   Result := False;
    11   LWebModule := ActivateWebModules;
    12   if Assigned(LWebModule) then
    13   try
    14     try
    15       if Supports(IInterface(LWebModule), IGetWebAppServices, LGetWebAppServices) then
    16         LWebAppServices := LGetWebAppServices.GetWebAppServices;
    17       if LWebAppServices = nil then
    18         for I := 0 to LWebModule.ComponentCount - 1 do
    19         begin
    20           LComponent := LWebModule.Components[I];
    21           if Supports(LComponent, IWebAppServices, LWebAppServices) then
    22             if LWebAppServices.Active then
    23               break
    24             else
    25               LWebAppServices := nil;
    26         end;
    27       if LWebAppServices = nil then
    28         LWebAppServices := TDefaultWebAppServices.Create;
    29       LWebAppServices.InitContext(LWebModule, Request, Response);
    30       try
    31         try
    32           Result := LWebAppServices.HandleRequest;
    33         except
    34           ApplicationHandleException(LWebAppServices.ExceptionHandler);
    35         end;
    36       finally
    37         LWebAppServices.FinishContext;
    38       end;
    39       if Result and not Response.Sent then
    40         Response.SendResponse;
    41     except
    42       ApplicationHandleException(LWebAppServices.ExceptionHandler);
    43     end;
    44   finally
    45     DeactivateWebModules(LWebModule);
    46   end;
    47 end;


    第11行代码,先得到一个激活的WebModule,如何没有,就会创建一个再返回。

    第14行到第26行代码,判断WebModule中是否实现了 IGetWebAppServices 接口的,具体做什么先略过。因为WebModule没有继承这个接口。

    第27行,创建一个默认的WebAppServices

    第32行,执行默认操作。

     1 function TDefaultWebAppServices.HandleRequest: Boolean;
     2 begin
     3   Result := InvokeDispatcher;
     4 end;
     5 
     6 function TDefaultWebAppServices.InvokeDispatcher: Boolean;
     7 begin
     8   if RequestHandler <> nil then
     9   begin
    10     Result := RequestHandler.HandleRequest(Request, Response);
    11   end
    12   else
    13     raise EWebBrokerException.CreateRes(@sNoDispatcherComponent);
    14 end;

    上面的RequestHandler是

        property RequestHandler: IWebRequestHandler read GetRequestHandler;

    function TDefaultWebAppServices.GetRequestHandler: IWebRequestHandler;
    begin
      if FRequestHandler = nil then
        FRequestHandler := FindRequestHandler;
      Result := FRequestHandler;
    end;
    
    function TDefaultWebAppServices.FindRequestHandler: IWebRequestHandler;
    var
      Component: TComponent;
    begin
      Result := nil;
      Component := FindWebDispatcher;
      if Component <> nil then
        if not Supports(Component, IWebRequestHandler, Result) then
          Assert(False, 'Expect support for IWebRequestHandler');  { do not localize }
    end;

    function TDefaultWebAppServices.FindWebDispatcher: TComponent;
    var
      J: Integer;
    begin
      Result := nil;
      if WebModule is TCustomWebDispatcher then
        Result := WebModule
      else
        for J := 0 to WebModule.ComponentCount - 1 do
          if WebModule.Components[J] is TCustomWebDispatcher then
          begin
            Result := WebModule.Components[J];
            break;
          end;
    end;


    上面红色标记的代码,最终会返回 WebModule.

      TWebModule = class(TCustomWebDispatcher)

    所以,上面绿色标记的代码,是调用TCustomWebDispatcher.HandleRequest方法, 内部代码如下:

    function TCustomWebDispatcher.HandleRequest(
      Request: TWebRequest; Response: TWebResponse): Boolean;
    begin
      FRequest := Request;
      FResponse := Response;
      Result := DispatchAction(Request, Response);
    end;
  • 相关阅读:
    linux下netstat命令详解
    linux下strace命令详解
    /proc/uptime
    趣味理解网关、路由等概念
    OPENCV运行的问题,自带的程序可以运行,但是自己制作的QT报错
    第九章 MIZ702 ZYNQ片上ADC的使用
    第四章 MIZ701 ZYNQ制作UBOOT固化程序
    第三章 VIVADO 自定义IP 流水灯实验
    第一章 MIZ701 VIVADO 搭建SOC最小系统HelloWorld
    Zynq-7000 MiZ701 SOC硬件使用手册
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/4818756.html
Copyright © 2020-2023  润新知